python - super(subclass, class).__new__(class) 是做什么的?

标签 python inheritance

在以下 Python 中执行 Singleton pattern :

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) 作为参数吗?

Live example

最佳答案

super() 的第二个参数有两个用途:

  • 提供要搜索的类的有序列表;该顺序是方法解析顺序 (MRO),在 super() 上搜索属性从作为 super() 的第一个参数命名的类之后的类开始/p>

  • 将任何描述符(如方法)绑定(bind)到。

所以 super(clsobject, second_argument) 将查找一个 __mro__ 列表,然后搜索 clsobject,然后继续搜索剩余的列出您想要的属性。然后它使用 descriptor protocol将对象绑定(bind)到 second_argument

__new__ 方法只对类有意义,因为它创建了一个新实例;调用该方法时还没有实例;它是应该为该类生成实例的工厂。

所以你不能传入一个实例作为第二个参数。您只能传入一个类,super() 可以处理。例如,super() 查看 type(instance).__mro__,但对于类,则使用 classobject.__mro__。所以在这里传递 cls 是完全没问题的。

__new__ 也是一个静态方法,这意味着它会忽略绑定(bind)过程。不会自动传递第一个参数类。您需要手动执行此操作,因此需要调用 ...__new__(cls)

所以在这个特定的例子中,行:

cls.instance = super(Singleton, cls).__new__(cls)

将在 cls.__mro__ 中搜索 Singleton,找到下一个具有 __new__ 属性的对象,然后尝试绑定(bind)那个 __new__ 属性到 cls。如果您没有使用多重继承,那就是 object.__new____new__ 方法是静态的,所以没有绑定(bind)发生,所以你得到了 object.__new__,然后用 cls 作为第一个调用争论。这会生成 Singleton 类(或其子类)的实例,然后将其分配给类对象上的属性 instance

关于python - super(subclass, class).__new__(class) 是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50211702/

相关文章:

python - 为什么 Python `Memory Error` 列表 `append()` 剩余大量 RAM

python - 通过边缘校正波浪图像

c# - 基类实现抽象时在派生类中指定实现接口(interface)

javascript - 我应该在 javascript 中使用多态性吗?

c++ - 为什么这不是内存泄漏?或者是吗?删除没有虚拟析构函数的基类指针

python - sublime text + python 的 anaconda

python - csv.reader 将逗号变成句号并抛出错误

oop - 迭代具有不同属性的子类

python - 如何将可能为 None 到 '%s' 的字符串写入文件(python)

c# - 如何解决密封类的不可能继承?