9.2.2 调用未关联的超类构造函数
本节介绍的方法主要用于解决历史遗留问题。在较新的Python版本中,显然应使用函数super(这将在下一节讨论)。然而,很多既有代码使用的都是本节介绍的方法,因此你必须对其有所了解。另外,这种方法也极具启迪意义,淋漓尽致地说明了关联方法和未关联方法之间的差别。
言归正传。如果你觉得本节的标题有点吓人,请放松心情。调用超类的构造函数实际上很容易,也很有用。下面先给出前一节末尾问题的解决方案。
class SongBird(Bird):
def __init__(self):
Bird.__init__(self)
self.sound = 'Squawk!'
def sing(self):
print(self.sound)
在SongBird类中,只添加了一行,其中包含代码Bird.__init__(self)。先来证明这确实管用,再解释这到底意味着什么。
>>> sb = SongBird()
>>> sb.sing()
Squawk!
>>> sb.eat()
Aaaah ...
>>> sb.eat()
No, thanks!
这样做为何管用呢?对实例调用方法时,方法的参数self将自动关联到实例(称为关联的方法),这样的示例你见过多个。然而,如果你通过类调用方法(如Bird.__init__),就没有实例与其相关联。在这种情况下,你可随便设置参数self。这样的方法称为未关联的。这就对本节的标题做出了解释。
通过将这个未关联方法的self参数设置为当前实例,将使用超类的构造函数来初始化SongBird对象。这意味着将设置其属性hungry。
领取专属 10元无门槛券
私享最新 技术干货