Python:在基类init中调用overriden基类方法

时间:2014-10-02 16:46:28

标签: python initialization super

考虑以下类,运行python2.7:

class S(object):
  def __init__(self):
    print 'Si'
    self.reset()

  def reset(self):
    print 'Sr'
    self.a=0

class U1(S):
  def reset(self):
    print 'U1r'
    self.b=0
    super(S,self).reset()

所需的功能是

  1. 创建基类的实例调用其reset方法;
  2. 创建派生类的实例会调用其reset方法,并调用基类的重置方法。
  3. 我得到(1):

    >>> print S().a
    Si
    Sr
    0
    

    但不是(2):

    >>> print U1().b
    Si
    U1r
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "tt.py", line 4, in __init__
        self.reset()
      File "tt.py", line 14, in reset
        super(S,self).reset()
    AttributeError: 'super' object has no attribute 'reset'
    

    什么是获得我想要的最干净的方式?我认为错误与类成员资格构建的顺序有关,但我无法从文档中弄清楚。 。

2 个答案:

答案 0 :(得分:2)

您应该在super(U1, self).reset()中致电U1.reset()。使用super时,应始终将当前类的名称作为第一个参数传递,而不是父类的名称。 As stated in the docs

  

<强> super(type[, object-or-type])

     

返回一个代理对象,该方法将方法调用委托给 type 的父类或兄弟类

super将在您提供的type的父级或兄弟级别上查找该方法。当您提供父类时,它将尝试在父项的父项/兄弟项上查找reset的实现,这将失败。

答案 1 :(得分:1)

应该是:

super(U1, self).reset()

在我脑海中,我读了超级(U1,...&#34;作为&#34; U1和#34的父母;为了保持原状。