我正在编写我的第一个python脚本,这个包/模块的东西让我疯了。让我们从我的文件夹布局开始
builder.py
-buildModule\__init__.py
-buildModule\AppList.py
-buildModule\BuildClass.py
-buildModule\ConfigSystem.py
-buildModule\MenuSystem.py
-buildModule\Singleton.py
好的,所以我的__init__.py
看起来像这样
from ConfigSystem import *
from BuildClass import *
from MenuSystem import *
from AppList import *
from buildModule.Singleton import Singleton
现在,我试图将我的配置系统装饰为单身,这样我的单身人士就像
class Singleton:
def __init__(self, decorated):
self._decorated = decorated
def Instance(self):
try:
return self._instance
except AttributeError:
self._instance = self._decorated()
return self._instance
def __call__(self):
raise TypeError(
'Singletons must be accessed through the `Instance` method.')
现在,使用我的configsystem类,如果我正确阅读手册,这应该可行
import Singleton
@Singleton
class ConfigSystem:
但即将到来
TypeError: 'module' object is not callable
我现在已经多次阅读了本手册的模块部分而且还没有完全掌握它。为什么这不起作用?
是否有某个模块/软件包教程在那里写得比手册更清晰/不同?
答案 0 :(得分:3)
您需要将import Singleton
更改为from Singleton import Singleton
(或当Alex建议将@Singleton
更改为@Singleton.Singleton
。
一般情况下,您应该使用合格的导入来避免命名空间冲突,例如,import SomeModule
使用SomeModule.SomeClass
这样的调用,或者为了简洁,例如import SomeModule as SM
,调用SM.SomeClass
或SM.some_function
而不是从from SomeModule import *
等模块中导入所有内容。
你有名称冲突,其中Singleton
指的是模块(例如,Singleton.py
是一个类/函数/变量集合的文件)而不是Singleton类({{1} })。具体来说,在您的装饰者中class Singleton(object)
@Singleton
指的是模块(您Singleton
或import some_module
),而不是类或函数。
答案 1 :(得分:2)
将import Singleton
更改为from Singleton import Singleton
,或将@Singleton
更改为@Singleton.Singleton
。