我知道当我们跨超级方法调用父方法时,我们可以忽略绑定方法中的“self”参数,如下所示:
class Foo(object):
def __init__(self):
super(Foo, self).__init__() # We needn't pass in the "self" argument
# ...
但有些东西有所不同__new__
method:
class Bar(object):
def __new__(cls, *args, **kwargs):
return super(Bar, cls).__new__(cls, *args, **kwargs) # Why need a "cls" argument?
__new__
不是实例方法;它是一个传递类对象的静态方法(使其也不完全是一个类方法)。
来自__new__文档:
__new__()
是一个静态方法(特殊情况,因此不需要这样声明),它将请求实例的类作为其第一个参数。
因此,即使使用super()
查找下一个__new__
MRO中的方法,仍然需要传入cls
明确地。
带双下划线的特殊方法通常在type,所以在该类的元类上(即type()
默认情况下)。那是行不通的__new__
因为你直接在类本身上声明了它。因此没有描述符协议可以应用either(对于类和实例方法,这通常将函数转换为绑定方法)。就这样__new__
钩子必须是特殊的,并且永远不会被绑定。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)