27

正如我刚刚学到的,我可以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 而无需指定objorcls进行操作。但是为什么我不能这样做__new__呢?因为,在案例 3 中,如果我以这种方式使用 super ,则会出现错误。但如果我这样使用它:

super(B, cls).__new__(cls)

没有错误。

4

1 回答 1

34

Python 发行说明中关于覆盖该__new__方法:

__new__静态方法,不是类方法。我最初认为它必须是一个类方法,这就是我添加 classmethod 原语的原因。不幸的是,对于类方法,向上调用在这种情况下无法正常工作,因此我不得不将其设为静态方法,并以显式类作为其第一个参数。

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

于 2011-09-19T13:09:47.160 回答