我正在写我的第一个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现在,我尝试将我的configsystem装饰成一个单例,这样我的单例看起来就像
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我已经多次阅读了手册中的模块部分,但我并不完全理解。为什么这不起作用?
有没有什么模块/包教程比手册写得更清楚/不同?
发布于 2011-09-20 04:16:22
您需要将import Singleton更改为from Singleton import Singleton (或者按照Alex的建议将@Singleton更改为@Singleton.Singleton。
通常,您应该使用限定导入来避免名称空间冲突,例如,使用SomeModule.SomeClass这样的调用使用import SomeModule,或者为了简洁起见,使用SM.SomeClass或SM.some_function这样的调用使用import SomeModule as SM,而不是从from SomeModule import *这样的模块导入所有内容。
您会遇到名称冲突,其中Singleton引用的是模块(例如,Singleton.py是类/函数/变量的集合的文件),而不是单例类(class Singleton(object))。具体地说,在您的装饰器中,@Singleton Singleton引用的是模块( import some_module或from some_module import a_class_or_object),而不是类或函数。
发布于 2011-09-20 04:19:35
将import Singleton更改为from Singleton import Singleton,或将@Singleton更改为@Singleton.Singleton。
https://stackoverflow.com/questions/7476742
复制相似问题