我已经进入了我的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'
什么是错的?
答案 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()