super(子类,类).__ new __(class)做什么?

tec*_*kuz 3 python inheritance

在以下Singleton模式的Python实现中:

class Singleton(object):
    def __new__(cls):
        if not hasattr(cls, 'instance'):
            cls.instance = super(Singleton, cls).__new__(cls)
        return cls.instance
Run Code Online (Sandbox Code Playgroud)

这条线cls.instance = super(Singleton, cls).__new__(cls)做什么?

在这一行中,我不明白的是super用法.我看到了superwith的用法(subclass, instance),但在这里我们通过它(subclass, class).它会(Singleton class, Singleton class)作为参数吗?

实例

Mar*_*ers 5

第二个参数super()用于两个目的:

  • 提供要搜索的有序类列表; 顺序是方法解析顺序(MRO),并在super()类名为第一个参数的类之后的类中开始搜索属性super()

  • 绑定任何描述符(如方法).

因此,super(clsobject, second_argument)将查找__mro__列表,然后搜索clsobject,然后继续搜索列表的其余部分以查找所需的属性.然后,它使用描述符协议将对象绑定到second_argument.

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

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

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

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

cls.instance = super(Singleton, cls).__new__(cls)
Run Code Online (Sandbox Code Playgroud)

将搜索Singletoncls.__mro__,发现有下一个对象__new__的属性,然后尝试结合__new__属性cls.如果你没有使用多重继承,那就是object.__new__.该__new__方法是静态的,因此不会发生绑定,因此您将获得object.__new__,然后将其cls作为第一个参数调用.这将生成Singleton类(或其子类)的实例,然后将其分配给instance类对象上的属性.

  • @ PM2Ring:是的,因为`super()`然后找到`__class__`闭包(设置为`Singleton`)和方法的*first*参数,这里`cls`(这总是代码对象中的第一个名字)当地名称). (2认同)