在Singleton pattern的以下Python
实现中:
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()
的第一个参数后面的类开始将任何描述符(如方法)绑定到。
因此
super(clsobject, second_argument)
将查找__mro__
列表,然后搜索clsobject
,然后继续在列表的其余部分搜索所需的属性。然后它使用descriptor protocol将对象绑定到second_argument
。你知道吗__new__
方法只对类有意义,因为它创建了一个新实例;调用该方法时还没有实例;应该是工厂为该类生成实例。你知道吗所以不能将实例作为第二个参数传入。您只能传入一个类,
super()
可以处理它。例如,super()
查看type(instance).__mro__
,但是对于类,使用classobject.__mro__
。所以在这里传递cls
是非常好的。你知道吗__new__
也是一个静态方法,这意味着它忽略了绑定过程。不会自动传入第一个参数类。您需要手动执行此操作,因此...__new__(cls)
调用。你知道吗在这个特定的例子中,行:
将在
cls.__mro__
中搜索Singleton
,找到下一个具有__new__
属性的对象,然后尝试将该__new__
属性绑定到cls
。如果您没有使用多重继承,那将是object.__new__
。__new__
方法是静态的,因此不发生任何绑定,因此给您提供了object.__new__
,然后用cls
作为第一个参数调用它。这将生成Singleton
类(或其子类)的实例,然后将其分配给class对象上的属性instance
。你知道吗相关问题 更多 >
编程相关推荐