我已经阅读了大量关于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'
我正在寻找帮助实现这种情况的输入/帮助。
**
摘要要求:
**
任何输入/帮助/指针都将受到赞赏。
此致
沙拉德帕
答案 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