【问题标题】:Python3 Singleton metaclass method not workingPython3 Singleton元类方法不起作用
【发布时间】:2013-06-18 17:44:39
【问题描述】:

我看到了很多在 Python 中创建单例的方法,我尝试在 Python 3.2 (Windows) 中使用元类实现,但它似乎没有返回我的单例类的相同实例。

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

class MyClass(object):
    __metaclass__ = Singleton

a = MyClass()
b = MyClass()
print(a is b) # False

我现在使用装饰器实现,它正在工作,但我想知道这个实现有什么问题?

【问题讨论】:

  • 我知道这个帖子很老了,但是如果你用 Python3 编程,为什么还要使用 Python2 语法呢?
  • 还有其他人为允许类接受参数而烦恼吗?当使用两组不同的参数“实例化”单例时,定义了什么行为?

标签: python python-3.x singleton metaclass


【解决方案1】:

Python3 中的元类语法has changed。见the documentaition

class MyClass(metaclass=Singleton):
    pass

它有效:

>>> MyClass() is MyClass()
True

【讨论】:

  • 你的名字很贴切。我发现的所有教程都非常好,但从未针对 Python 3 进行更新。您只是将可能需要几天的时间缩短为几个小时......谢谢。
  • 您离开了父类(对象)。它仍然有效吗?是否有理由使用 class MyClass(object, metaclass=Singleton) 之类的东西?
  • 如果你想继承object以外的东西。 object 是多余的。
  • 我必须做class MyClass (__metaclass__=Singleton):,这是元类两侧的双下划线,否则我会得到The word metaclass is not correctly spelled
猜你喜欢
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多