【发布时间】:2017-11-26 00:45:59
【问题描述】:
我想在python中实现一个单例模式,我喜欢http://www.python-course.eu/python3_metaclasses.php中描述的模式。
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 SingletonClass(metaclass=Singleton):
pass
class RegularClass():
pass
x = SingletonClass()
y = SingletonClass()
print(x == y)
x = RegularClass()
y = RegularClass()
print(x == y)
而且代码运行良好。但是,__call__() 没有self,也没有@classmethod 或@staticmethod 声明。
但是,在 Python 数据模型 https://docs.python.org/3/reference/datamodel.html#object.__call__ 中,__call__() 方法的参数中有一个 self。
如果我通过self,或声明为@staticmethod 或@classmethod,代码将不起作用。
谁能解释一下__call__()方法背后的语法逻辑。
【问题讨论】:
-
如果我通过自我,代码将不起作用:你是如何在这里“通过自我”的?如果您将
cls重命名为self(函数中的所有位置,而不仅仅是参数),代码将继续工作。见鬼,把它重命名为gabbledygook就可以了。
标签: python python-3.x metaclass class-method