在以下 Python
中执行 Singleton pattern :
class Singleton(object):
def __new__(cls):
if not hasattr(cls, 'instance'):
cls.instance = super(Singleton, cls).__new__(cls)
return cls.instance
cls.instance = super(Singleton, cls).__new__(cls)
行是做什么的?
在这一行中,我不明白的是 super
的用法。我看到 super
与 (subclass, instance)
的用法,但这里我们传递它 (subclass, class)
。那么它会以 (Singleton class, Singleton class)
作为参数吗?
最佳答案
super()
的第二个参数有两个用途:
提供要搜索的类的有序列表;该顺序是方法解析顺序 (MRO),在
super()
上搜索属性从作为super()
的第一个参数命名的类之后的类开始/p>将任何描述符(如方法)绑定(bind)到。
所以 super(clsobject, second_argument)
将查找一个 __mro__
列表,然后搜索 clsobject
,然后继续搜索剩余的列出您想要的属性。然后它使用 descriptor protocol将对象绑定(bind)到 second_argument
。
__new__
方法只对类有意义,因为它创建了一个新实例;调用该方法时还没有实例;它是应该为该类生成实例的工厂。
所以你不能传入一个实例作为第二个参数。您只能传入一个类,super()
可以处理。例如,super()
查看 type(instance).__mro__
,但对于类,则使用 classobject.__mro__
。所以在这里传递 cls
是完全没问题的。
__new__
也是一个静态方法,这意味着它会忽略绑定(bind)过程。不会自动传递第一个参数类。您需要手动执行此操作,因此需要调用 ...__new__(cls)
。
所以在这个特定的例子中,行:
cls.instance = super(Singleton, cls).__new__(cls)
将在 cls.__mro__
中搜索 Singleton
,找到下一个具有 __new__
属性的对象,然后尝试绑定(bind)那个 __new__
属性到 cls
。如果您没有使用多重继承,那就是 object.__new__
。 __new__
方法是静态的,所以没有绑定(bind)发生,所以你得到了 object.__new__
,然后用 cls
作为第一个调用争论。这会生成 Singleton
类(或其子类)的实例,然后将其分配给类对象上的属性 instance
。
关于python - super(subclass, class).__new__(class) 是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50211702/