擅长:python、mysql、java
<p>听起来您可能对Python中继承的工作方式感到困惑。在您展示的代码中,<code>f</code>和<code>b</code>没有关系,除非它们是相邻实例化的。你知道吗</p>
<p>但是,您的<code>Bar</code>实例<code>b</code>确实可以访问<code>Foo</code>实例,即它本身。通过声明<code>Bar</code>是<code>Foo</code>的一个子类,您的意思是<code>Bar</code>的每个实例也是<code>Foo</code>的一个实例。你可以用<code>isinstance(b, Foo)</code>来测试这个。你知道吗</p>
<p>如果需要从<code>bar</code>的方法访问<code>Foo</code>中定义的变量或方法,通常可以直接通过传递的<code>self</code>值访问它。或者,如果要重写<code>Bar</code>中的方法(即,定义一个与<code>Foo</code>中已存在的方法同名的方法),则可以使用<a href="http://docs.python.org/dev/library/functions.html#super" rel="nofollow">^{<cd16>}</a>:</p>
<pre><code>class Foo:
def __init__(self, a):
self.a = a
def sayHello(self):
print("Hello!")
class Bar(Foo):
def __init__(self, a, b):
super().__init__(self, a) # calls overridden __init__ method from Foo
self.b = b
def doSomething(self):
self.sayHello() # calls a method defined in Foo
return self.a + self.b # accesses variable "a" that was set in Foo
</code></pre>
<p>(请注意,上面的代码是针对python3的。有一些小问题会使它在Python2中无法正常工作。如果我建议您学习Python以外的任何其他应用程序,请参见第3章</p>