需要python包和模块的解释
我正在写我的第一个python脚本,这个包/模块的东西让我疯了。让我们开始与我的文件夹布局需要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.')
现在,与我的配置系统类,如果即时阅读手册正确,这应该工作
import Singleton
@Singleton
class ConfigSystem:
但即时得到
TypeError: 'module' object is not callable
我已经阅读手册几次的模块组成部分,现在和IM不太得到它。为什么这不起作用?
是否有一个模块/包教程在那里写得比手册更清晰/不同?
您需要更改import Singleton
到from Singleton import Singleton
(或亚历克斯建议改变@Singleton
到@Singleton.Singleton
。
一般来说,你应该使用合格的进口,以避免命名空间冲突,如import SomeModule
与呼叫像SomeModule.SomeClass
或简洁类似import SomeModule as SM
与像SM.SomeClass
或SM.some_function
呼叫,而不是从一个模块像from SomeModule import *
进口一切。
你有名称冲突,其中Singleton
所指到模块(例如,Singleton.py
是一个类/函数/变量集合的文件)而不是Singleton类(class Singleton(object)
)。具体来说,在您的修饰器@Singleton
Singleton
指的是模块(您import some_module
或from some_module import a_class_or_object
)而不是类或函数。
要么将import Singleton
更改为from Singleton import Singleton
,要么将@Singleton
更改为@Singleton.Singleton
。
为什么'ConfigSystem'是模块名称和类名?这不会令人困惑吗?你能改变其中一个名字吗?它几乎可以消除你的''模块'对象不可调用'错误。 –
尝试“从Singleton import Singleton”。你导入的Singleton不是一个类,而是一个模块。这就是你的错误信息所说的。 – rocksportrocker
@scphantm嘿,这是_my_单身执行。 [Character for character](http://stackoverflow.com/questions/42558/python-and-the-singleton-pattern/7346105#7346105)。 :D我很高兴你发现它很有用,但要小心:如果你以后想要继承那个单例,它就不起作用。 –