需要解释python包和模块

时间:2011-09-19 20:13:46

标签: 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

现在,我试图将我的配置系统装饰为单身,这样我的单身人士就像

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

我现在已经多次阅读了本手册的模块部分而且还没有完全掌握它。为什么这不起作用?

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

2 个答案:

答案 0 :(得分:3)

您需要将import Singleton更改为from Singleton import Singleton(或当Alex建议将@Singleton更改为@Singleton.Singleton

一般情况下,您应该使用合格的导入来避免命名空间冲突,例如,import SomeModule使用SomeModule.SomeClass这样的调用,或者为了简洁,例如import SomeModule as SM,调用SM.SomeClassSM.some_function而不是从from SomeModule import *等模块中导入所有内容。

你有名称冲突,其中Singleton指的是模块(例如,Singleton.py是一个类/函数/变量集合的文件)而不是Singleton类({{1} })。具体来说,在您的装饰者中class Singleton(object) @Singleton指的是模块(您Singletonimport some_module),而不是类或函数。

答案 1 :(得分:2)

import Singleton更改为from Singleton import Singleton,或将@Singleton更改为@Singleton.Singleton