<p>关于<code>super()</code>的用法有很多问题,但似乎没有一个能回答我的问题。</p>
<p>从子类调用<code>super().__init__()</code>时,超级构造函数中的所有方法调用实际上都是从子类中获取的。考虑以下类结构:</p>
<pre><code>class A(object):
def __init__(self):
print("initializing A")
self.a()
def a(self):
print("A.a()")
class B(A):
def __init__(self):
super().__init__()
# add stuff for B
self.bnum=3 # required by B.a()
def a(self):
print("B.a(), bnum=%i"%self.bnum)
b=B()
</code></pre>
<p>失败的是</p>
<pre><code>initializing A
Traceback (most recent call last):
File "classmagic.py", line 17, in
b=B()
File "classmagic.py", line 11, in __init__
super().__init__()
File "classmagic.py", line 5, in __init__
self.a()
File "classmagic.py", line 15, in a
print("B.a(), bnum=%i"%self.bnum)
AttributeError: 'B' object has no attribute 'bnum'
</code></pre>
<p>在这里,我调用<code>B()</code>中的超级构造函数来初始化一些基本结构(其中一些结构作为自己的函数<code>a()</code>执行)。但是,如果我也重写<code>a()</code>函数,则在调用<code>A</code>的构造函数时使用此实现,该构造函数失败的原因是<code>A</code>对<code>B</code>一无所知,并且可能使用不同的内部变量。</p>
<p>这可能是直观的,也可能不是直观的,但是当我希望<code>A</code>中的所有方法都只能访问在那里实现的函数时,我必须做什么?</p>