python中如果子类没有构造方法,就会调用父类构造方法初始化子类对象,但是如果子类有自己的构造方法,那么初始化子类对象的时候只会调用自己的构造方法,不会调用父类构造方法,所以这时父类的属性不能被直接继承(方法可以继承)
在明白了构造方法之后,我们来点进阶的问题,那就是构造方法中的初始值无法继承的问题。
例子:
复制代码
class Bird:
def __init__(self):
self.hungry = True
def eat(self):
if self.hungry:
print 'Ahahahah'
else:
print 'No thanks!'
class SongBird(Bird):
def __init__(self):
self.sound = 'Squawk'
def sing(self):
print self.song()
sb = SongBird()
sb.sing() #能正常输出
sb.eat() #报错,因为songgird中没有hungry特性
复制代码
那解决这个问题的办法有两种:
1、调用未绑定的超类构造方法(多用于旧版python阵营)
复制代码
class SongBird(Bird):
def __init__(self):
Bird.__init__(self)
self.sound = 'Squawk'
def sing(self):
print self.song()
复制代码
原理:在调用了一个实例的方法时,该方法的self参数会自动绑定到实例上(称为绑定方法);如果直接调用类的方法(比如Bird.init),那么就没有实例会被绑定,可以自由提供需要的self参数(未绑定方法)。
2、使用super函数(只在新式类中有用)
复制代码
class SongBird(Bird):
def __init__(self):
super(SongBird,self).__init__()
self.sound = 'Squawk'
def sing(self):
print self.song()
复制代码
原理:它会查找所有的超类,以及超类的超类,直到找到所需的特性为止。