Python类包含错误的行为

时间:2009-04-06 18:37:35

标签: python

我已经进入了我的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 个答案:

答案 0 :(得分:4)

如图所示,这非常令人困惑。

当你说

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())。

答案 1 :(得分:3)

  

ctrl = controller

'controller'是一个模块,代表整个'controller.py'文件。在Python中,与Java不同,模块中可以定义任意数量的符号,因此导入的模块与其中定义的类之间不存在1:1的关系。

因此脚本抱怨因为'controller'模块没有'div'功能; 'div'被定义为'控制器'类里面的方法'controller'模块。如果你想要一个controller()类的实例,你需要说:

ctrl= controller.controller()

(还要注意实例化对象的(),或者你将获得类本身而不是实例。如果你真的想在类中定义静态方法,那么你可以在没有实例的情况下调用它,你可以使用'staticmethod'装饰器并省略'self'来做到这一点。)

通常最好用初始资本命名你的课程以避免混淆:

class Controller(object):
    ...

ctrl= controller.Controller()

答案 2 :(得分:2)

您应该创建一个控制器实例,如下所示:

ctrl = controller()

注意控制器后面的括号。

答案 3 :(得分:1)

执行以下代码时

from modules import controller
ctrl = controller

ctrl 变量成为指向控制器类的指针。 要创建 controller 类的实例,您需要添加括号:

from modules import controller
ctrl = controller()