【发布时间】:2021-08-02 10:28:38
【问题描述】:
我在网上看到了一些关于如何利用 python 元类强制将类创建为单例的材料。代码sn-p大致如下:
class SingletonMetaClass(type):
_instance = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instance:
# usually a lock is used here, but omitted for simplicity
cls._instance[cls] = super().__call__(*args, **kwargs)
return cls._instance[cls]
class SingletonBaseClass(object, metaclass=SingletonMetaClass):
def __init__():
pass
class SingletonDerivedClass(SingletonBaseClass):
def __init__():
pass
上面的 sn-p 非常适合我 - SingletonDerivedClass 的所有实例都是相同的。然而,我发现奇怪的是SingletonMetaClass 中的那行cls._instance[cls] = super().__call__(*args, **kwargs)。显然,前者cls指的是SingletonMetaClass本身,后者指的是子类,在这种情况下,它将是SingletonDerivedClass,但是__call__的签名里面只有一个cls,怎么办python解释器告诉哪个cls指的是什么?
任何回复将不胜感激!
【问题讨论】:
标签: python python-3.x metaclass