python - 假设 `obj` 的类型为 `objtype` ,那么 `super(cls,obj)` 和 `super(cls,objtype)` 是否相同?

标签 python python-3.x singleton super

在Python中,假设obj类型为objtype ,是super(cls,obj)super(cls,objtype)相同?

super(cls,obj) 是否正确?转换obj到另一个对象,其类是 objtype 的父类(super class)这是 cls 之后在 objtype 的 MRO 中?

super(cls,objtype) 是什么意思?那么是什么意思?

<小时/>

例如,给定单例设计模式的实现:

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是一个类?它返回什么?

谢谢。

最佳答案

根据docs , super

Return a proxy object that delegates method calls to a parent or sibling class of type.

因此,super 返回一个对象,该对象知道如何调用类层次结构中其他类的方法。

super 的第二个参数是 super 绑定(bind)的对象;通常这是类的实例,但是如果在类方法或静态方法的方法上下文中调用 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).__new__(cls) 返回调用 object.__new__(cls) 的结果,它是 的实例>单例。它以这种方式创建是为了避免递归调用 Singleton.__new__

关于python - 假设 `obj` 的类型为 `objtype` ,那么 `super(cls,obj)` 和 `super(cls,objtype)` 是否相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46167457/

相关文章:

python - 如何查询数据框两列的值

python - Django 属性错误 : 'str' object has no attribute 'model'

python - osx homebrew 缺少 pip 安装 python3.5

ios - 初始化时的用户单例和 nsuserdefault

python - 更新 matplotlib 动画中的 x 轴标签

string - Python将字符串转换为变量名

python-3.x - 对字符串使用 split 方法会返回空字符串

c# - 我应该将比较器缓存在静态字段中吗?

ruby-on-rails - Rails 跨 Controller 的单例对象清除

python - 使用ffmpeg读取streamlink m3u8文件