Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 假设'obj'有'objtype'类型,那么'super(cls,obj)'和'super(cls,objtype)'是否相同?_Python_Python 3.x_Singleton_Super - Fatal编程技术网

Python 假设'obj'有'objtype'类型,那么'super(cls,obj)'和'super(cls,objtype)'是否相同?

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

在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__(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