超级和__new__混乱

时间:2011-09-19 12:54:26

标签: python class-method

正如我刚刚学到的,我可以这样使用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,而无需指定objcls进行操作。 但为什么我不能为__new__做同样的事情呢? 因为,在第3种情况下,如果我使用超级方式,我就会出错。 但如果我这样使用它:

super(B, cls).__new__(cls)

没有错误。

1 个答案:

答案 0 :(得分:33)

从覆盖__new__方法的Python release notes开始:

  

__new__静态方法,而不是类方法。我最初想的是   必须是一个类方法,这就是为什么我添加了   classmethod原语。不幸的是,使用类方法,upcalls   在这种情况下不能正常工作,所以我必须使它成为一个静态方法   使用显式类作为其第一个参数。

由于__new__是静态方法,super(...).__new__返回静态方法。在这种情况下,cls没有绑定到第一个参数。所有参数都需要明确提供。