2011-09-19 79 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