为什么__new__方法在超级方法中调用其父命令__new__时需要传递cls参数?

时间:2013-11-14 08:50:48

标签: python super

我知道当我们通过super方法调用parent的方法时,我们可以忽略绑定方法中的“self”参数,如下所示:

class Foo(object):
    def __init__(self):
        super(Foo, self).__init__() # We needn't pass in the "self" argument
        # ...

但是__new__方法有些不同:

class Bar(object):
    def __new__(cls, *args, **kwargs):
        return super(Bar, cls).__new__(cls, *args, **kwargs) # Why need a "cls" argument?

1 个答案:

答案 0 :(得分:5)

__new__不是实例方法;它是一个传递类对象的静态方法(使它不是一个类方法)。

来自__new__ documentation

  

__new__()是一个静态方法(特殊的,所以你不需要声明它),它将请求实例的类作为它的第一个参数。

因此,即使使用super()在MRO中查找下一个__new__方法,您仍需要明确传递cls

具有双下划线的特殊方法通常在类型上查找,因此在类的元类上(默认为type())。这对__new__不起作用,因为你直接在类本身上声明它。因此,不能将descriptor protocol应用于 (对于类和实例方法,这通常会将函数转换为绑定方法)。因此,__new__钩子必须是特殊的,并且永远不会束缚。