如何创建一个实现抽象类的单例类,而不会陷入元类冲突?

时间:2016-08-23 07:52:55

标签: python python-3.x singleton abstract

我已经阅读了大量关于SO的有用信息以及http://www.phyast.pitt.edu/~micheles/python/metatype.html上的文章

然而,我想我仍然没有找到答案。因此,一个新问题。

我正在为内部使用创建一个函数/类库。作为其中的一部分,我想创建一个Singleton类。任何其他类都应该能够继承它并成为Singleton。这些类应该是可分类的。

Creating a singleton in Python的每篇帖子中,我实施了:

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 Singleton(_Singleton('SingletonMeta', (object,), {})):
    pass

有效。它有助于创建一个可以分类的单例类。

我的库中会有一些类使用abc实现一个抽象类。这样的类或实现这个抽象类的类可能是Singleton。

所以,

import abc
class Foo(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def bar(self): pass

class Bar(Singleton, Foo):    # This generates the meta-class conflict
    def bar(self):
        return 'implemented'
    def bat(self):
        return 'something else'

我正在寻找帮助实现这种情况的输入/帮助。

**

摘要要求:

**

  • 创建Singleton类的机制。
  • 实现为的类 Singleton(通过上述机制)应该是可分类的。子 class我有额外的/新方法而不是基类。
  • 创建抽象类的机制(abc有助于此)。
  • 此抽象类的实现,充当Singleton。它
    可能有比抽象类本身更多的方法。

任何输入/帮助/指针都将受到赞赏。

此致

沙拉德帕

1 个答案:

答案 0 :(得分:0)

您可以在您的层次结构的Base类上执行此操作,而不是使用元类来注册您的单例 - 只需将单例逻辑放在__new__方法上。这样,您不必仅仅因为这种aditional行为而更改元类,并且abc.metaclasses将起作用。

import abc
class Foo(metaclass=abc.ABCMeta):
    _singleton_registry = {}
    def __new__(cls, *args, **kw):
        if cls in in __class__._singleton_registry:
            return __class__._singleton_registry[cls]
        singleton = super().__new__(*args, **kw)
        __class__._singleton_registry[cls] = singleton
        return singleton

    @abc.abstractmethod
    def bar(self): pass
相关问题