【问题标题】:need an explanation of python packages and modules需要python包和模块的解释
【发布时间】:2011-09-19 20:13:45
【问题描述】:

我正在编写我的第一个 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

我已经多次阅读手册的模块部分,但我不太明白。为什么这不起作用?

有没有比手册更清晰/不同的模块/包教程?

【问题讨论】:

  • 为什么ConfigSystem 是模块名和类名?这不会令人困惑吗?你能改变其中一个名字吗?它几乎可以消除您的'module' object is not callable 错误。
  • 尝试“从单例导入单例”。您导入的 Singleton 不是一个类,而是一个模块。这就是您的错误消息所说的内容。
  • @scphantm 嘿,这是 my 单例实现。 Character for character。 :D 我很高兴你发现它很有用,但要注意:如果你以后想从那个单例继承它就行不通了。
  • 是的,保罗,我在这里找到了它。仍在尝试习惯一个文件中的多个类。在专门从事 java 工作 9 年后,对于 python 之类的东西来说,这是一个相当大的变化。

标签: python


【解决方案1】:

您需要将 import Singleton 更改为 from Singleton import Singleton(或按照 Alex 的建议将 @Singleton 更改为 @Singleton.Singleton。

一般而言,您应该使用合格的导入来避免命名空间冲突,例如,import SomeModule 与 SomeModule.SomeClass 之类的调用或为简洁起见类似 import SomeModule as SM 与 SM.SomeClass 或 SM.some_function 之类的调用,而不是导入所有内容来自 from SomeModule import * 之类的模块。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-30
      • 2013-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 2020-02-20
      • 1970-01-01
      相关资源
      最近更新 更多