python中,类的构造方法是__init__()。当一个类被子类继承且子类重写了构造方法后,若子类还想使用父类的构造方法,
如果直接通过创建的子类对象调用父类的方法会报错。解决办法有两个:一个是调用超类方法的未绑定版本,一个是使用super函数
见下面的例子
class Bird(object):
def __init__(self):
self.hungry = True
def eat(self) :
if self.hungry:
print("Aaaah")
self.hungry = False
else:
print("No thanks.")
>>>b = Bird()
>>> b.eat()
Aaaah
>>> b.eat()
No thanks
给鸟这个类(class Bird)创建子类,会唱歌的鸟类
class SongBird (Bird):
def __init__(self):
self.sound = "Squawk"
def sing(self):
print(self.sound)
>>> sb = SongBird()
>>>sb.sing()
Squawk
也许一般大家都会想到,既然SongBird是Bird的一个子类,那么
SongBird应该也就继承了Bird的方法eat,事实上上述代码做不到这个功能。
下面调用会报错
>>>sb.eat()
改进方法之一:使用未绑定的超类的构造方法
class SongBird (Bird):
def __init__(self):
Bird.__init__(self)#使用未绑定的超类的构造函数
self.sound = "Squawk":
def sing(self):
print(self.sound)
然后再来使用就没用问题了
>>> sb = SongBird()
>>>sb.sing()
Squawk
>>> sb.eat()
Aaaah
>>> sb.eat()
No thanks
方法二:
class SongBird (Bird):
def __init__(self):
super(SongBird,self).__init__(self)#使用super函数,格式:super(父类,self).__init__(self)
self.sound = "Squawk"
def sing(self):
print(self.sound)
>>>sb.sing()
Squawk
>>> sb.eat()
Aaaah
>>> sb.eat()
No thanks