Python 假设'obj'有'objtype'类型,那么'super(cls,obj)'和'super(cls,objtype)'是否相同?
在Python中,假设Python 假设'obj'有'objtype'类型,那么'super(cls,obj)'和'super(cls,objtype)'是否相同?,python,python-3.x,singleton,super,Python,Python 3.x,Singleton,Super,在Python中,假设obj具有类型objtype,那么super(cls,obj)和super(cls,objtype)是否相同 super(cls,obj)将obj转换为另一个对象,该对象的类是objtype的超类,在objtype的MRO中位于cls之后,是否正确 那么super(cls,objtype)是什么意思 例如,给定Singleton设计模式的实现: class Singleton(object): _singletons = {} def __new__(cl
obj
具有类型objtype
,那么super(cls,obj)
和super(cls,objtype)
是否相同
super(cls,obj)
将obj
转换为另一个对象,该对象的类是objtype
的超类,在objtype
的MRO中位于cls
之后,是否正确
那么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
的任何子类(不会进一步覆盖\uuuuu new\uuuu
)都只有一个实例
super(Singleton,cls)
是什么意思,其中cls
是一个类?它的回报是什么
谢谢。根据,super
返回一个代理对象,该对象将方法调用委托给类型为的父类或同级类
因此super
返回一个对象,该对象知道如何调用类层次结构中其他类的方法
super
的第二个参数是super
绑定的对象;通常这是类的一个实例,但是如果在类方法或staticmethod的方法上下文中调用super
,那么我们希望对类对象本身而不是实例调用该方法
因此,调用super(SomeClass,cls)。some_method()
意味着对SomeClass
派生的类调用some_method
,而不是对这些类的实例调用。否则,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()
请注意,super(C,cls)
在python2中是必需的,但是在python3中一个空的super()
就足够了
在您的单例示例中,super(singleton,cls)。\uuuuuu new\uuuuu(cls)
返回调用对象的结果。\uuuuuuu new\uuuuu(cls)
,这是单例的一个实例。它是以这种方式创建的,以避免递归调用Singleton.\uuuu new\uuuu