我知道当我们通过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?
答案 0 :(得分:5)
__new__
不是实例方法;它是一个传递类对象的静态方法(使它不是一个类方法)。
__new__()
是一个静态方法(特殊的,所以你不需要声明它),它将请求实例的类作为它的第一个参数。
因此,即使使用super()
在MRO中查找下一个__new__
方法,您仍需要明确传递cls
。
具有双下划线的特殊方法通常在类型上查找,因此在类的元类上(默认为type()
)。这对__new__
不起作用,因为你直接在类本身上声明它。因此,不能将descriptor protocol应用于 (对于类和实例方法,这通常会将函数转换为绑定方法)。因此,__new__
钩子必须是特殊的,并且永远不会束缚。