在Python中,假设obj
的类型为objtype
,super(cls,obj)
和super(cls,objtype)
是否相同?
super(cls,obj)
将obj
转换为另一个对象,其类是objtype
的超类,在cls
的MRO中objtype
之后是否正确?
super(cls,objtype)
的含义是什么?
例如,给定Singleton设计模式的实现:
class Singleton(object):
_singletons = {}
def __new__(cls, *args, **kwds):
if cls not in cls._singletons:
cls._singletons[cls] = super(Singleton, cls).__new__(cls)
return cls._singletons[cls]
Singleton
的任何子类(不会进一步覆盖__new__
)只有一个实例。
super(Singleton, cls)
是什么意思,cls
是哪一类?它又回归了什么?
感谢。
答案 0 :(得分:1)
根据docs,super
返回一个代理对象,该方法将方法调用委托给类型的父类或兄弟类。
所以super
返回一个知道如何调用类层次结构中其他类的方法的对象。
super
的第二个参数是super
绑定的对象;通常这是类的一个实例,但是如果在类方法或static方法的方法的上下文中调用super
,那么我们想要在类对象本身而不是实例上调用该方法。
所以调用super(SomeClass, cls).some_method()
意味着在some_method
下降的类上调用SomeClass
,而不是在这些类的实例上调用。否则,super
调用的行为就像实例方法中的super
调用一样。
在不太复杂的代码中,用法看起来更自然:
class C(SomeBaseClass):
def method(self):
# bind super to 'self'
super(C, self).method()
@classmethod
def cmethod(cls):
# no 'self' here -- bind to cls
super(C, cls).cmethod()
请注意,python2中需要super(C, cls)
,但python3中的空super()
就足够了。
在您的单例示例中,super(Singleton, cls).__new__(cls)
返回调用object.__new__(cls)
的结果,Singleton
的实例。它是以这种方式创建的,以避免递归调用Singleton.__new__
。