正如我刚刚学到的,我可以这样使用super()
:
super(class, obj_of_class-or-_subclass_of_class)
代码如下:
#Case 1
class A(object):
def __init__(self):
print "A init"
class B(A):
def __init__(self):
print "B init"
super(B, self).__init__() #ok, I can invoke A's __init__ successfully
#Case 2
class A(object):
@classmethod
def foo(cls):
print "A foo"
class B(object):
@classmethod
def foo(cls):
print "B foo"
super(B, cls).foo() #ok, I can invoke A's foo successfully
#Case 3
class A(object):
def __new__(cls):
print "A new"
return super(A, cls).__new__(cls)
class B(A):
def __new__(cls):
print "B new"
return super(B, cls).__new__() #Oops, error
问题:
在案例1和案例2中,我可以成功使用super,而无需指定obj
或cls
进行操作。
但为什么我不能为__new__
做同样的事情呢?
因为,在第3种情况下,如果我使用超级方式,我就会出错。
但如果我这样使用它:
super(B, cls).__new__(cls)
没有错误。
答案 0 :(得分:33)
从覆盖__new__
方法的Python release notes开始:
__new__
是静态方法,而不是类方法。我最初想的是 必须是一个类方法,这就是为什么我添加了 classmethod原语。不幸的是,使用类方法,upcalls 在这种情况下不能正常工作,所以我必须使它成为一个静态方法 使用显式类作为其第一个参数。
由于__new__
是静态方法,super(...).__new__
返回静态方法。在这种情况下,cls
没有绑定到第一个参数。所有参数都需要明确提供。