5

我知道当我们通过超级方法调用父方法时,我们可以忽略绑定方法中的“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?
4

1 回答 1

8

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

__new__文档中:

__new__()是一个静态方法(特殊情况,因此您不需要这样声明),它将请求实例的类作为其第一个参数。

因此,即使用于在 MROsuper()中查找下一个__new__方法,您仍然需要cls显式传入。

带有双下划线的特殊方法通常在type上查找,因此在类的元类上查找(type()默认情况下)。那是行不通的,__new__因为您直接在类本身上声明了它。因此,也不能应用任何描述符协议(对于类和实例方法,这通常会将函数转换为绑定方法)。因此,钩子必须是特殊情况并且永远不会被绑定。__new__

于 2013-11-14T08:51:39.303 回答