2011-09-19 110 views
2

我正在写我的第一个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不太得到它。为什么这不起作用?

是否有一个模块/包教程在那里写得比手册更清晰/不同?

+0

为什么'ConfigSystem'是模块名称和类名?这不会令人困惑吗?你能改变其中一个名字吗?它几乎可以消除你的''模块'对象不可调用'错误。 –

+0

尝试“从Singleton import Singleton”。你导入的Singleton不是一个类,而是一个模块。这就是你的错误信息所说的。 – rocksportrocker

+0

@scphantm嘿,这是_my_单身执行。 [Character for character](http://stackoverflow.com/questions/42558/python-and-the-singleton-pattern/7346105#7346105)。 :D我很高兴你发现它很有用,但要小心:如果你以后想要继承那个单例,它就不起作用。 –

回答

3

您需要更改import Singletonfrom Singleton import Singleton(或亚历克斯建议改变@Singleton@Singleton.Singleton

一般来说,你应该使用合格的进口,以避免命名空间冲突,如import SomeModule与呼叫像SomeModule.SomeClass或简洁类似import SomeModule as SM与像SM.SomeClassSM.some_function呼叫,而不是从一个模块像from SomeModule import *进口一切。

你有名称冲突,其中Singleton所指到模块(例如,Singleton.py是一个类/函数/变量集合的文件)而不是Singleton类(class Singleton(object))。具体来说,在您的修饰器@SingletonSingleton指的是模块(您import some_modulefrom some_module import a_class_or_object)而不是类或函数。

2

要么将​​import Singleton更改为from Singleton import Singleton,要么将@Singleton更改为@Singleton.Singleton