Неправильное поведение включения класса Python - PullRequest
0 голосов
/ 06 апреля 2009

У меня в main.py

from modules import controller
ctrl = controller
help(ctrl)
print(ctrl.div(5,2))

и controllor.py:

class controller:
    def div(self, x, y): 
        return x // y

при запуске основного я получил ошибку:

Traceback (most recent call last):
  File "...\main.py", line 8, in ?
    print(ctrl.div(5,2))
AttributeError: 'module' object has no attribute 'div'

Что не так?

Ответы [ 4 ]

4 голосов
/ 06 апреля 2009

Это очень запутанно, как показано.

Когда вы говорите

from modules import controller

Вы заявляете, что у вас есть модуль с именем файла modules.py.

OR

Вы заявляете, что у вас есть пакет с именем modules. В этом каталоге есть файл __init__.py и модуль с именем файла controller.py

Вы должны уточнить это, чтобы быть точным. Похоже, вы неправильно назвали свои файлы и модули в приведенном здесь примере кода.

Когда вы говорите

from modules import controller

Это создает модуль (не класс) с именем controller.

Когда вы говорите

ctrl = controller

Это создает другое имя для controller модуля , ctrl.

Ни в коем случае вам не ссылаться на класс (controller.controller). Вы никогда не создавали экземпляр класса (controller.controller()).

3 голосов
/ 06 апреля 2009

ctrl = контроллер

«controller» - это модуль, представляющий весь ваш файл «controller.py». В Python, в отличие от Java, в модуле может быть определено любое количество символов, поэтому между импортированным модулем и определенным в нем классом не существует отношения 1: 1.

Так что скрипт жалуется, потому что у модуля «controller» нет функции «div»; «Div» определяется как метод класса «controller» внутри модуля «controller». Если вам нужен экземпляр класса controller (), вы должны сказать:

ctrl= controller.controller()

(Обратите внимание также на () для создания экземпляра объекта, или вы получите сам класс, а не экземпляр. Если вы действительно хотите определить статический метод в классе, чтобы вы могли вызывать его без экземпляра Вы можете сделать это, используя декоратор staticmethod и опуская self.)

Обычно лучше называть свои классы начальным капиталом, чтобы избежать путаницы:

class Controller(object):
    ...

ctrl= controller.Controller()
2 голосов
/ 06 апреля 2009

Вы должны создать экземпляр контроллера, например:

ctrl = controller()

Обратите внимание на скобки после контроллера.

1 голос
/ 07 апреля 2009

При выполнении следующего кода

from modules import controller
ctrl = controller

ctrl переменная становится указателем на контроллер класс. Чтобы создать экземпляр класса controller , необходимо добавить круглые скобки:

from modules import controller
ctrl = controller()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...