4.2
1. 子类
类别本身还可以进一步细化成子类,比如,鸟类可以进一步分成鸡,天鹅
在面向对象编程中,我们通过继承(Inheritance)来表达上述概念
class Bird(object):
feather = True
reproduction = 'egg'
def chirp(self,sound):
print(sound)
class Chicken(Bird):
how_to_move = 'walk'
edible = True
class Swan(Bird):
how_to_move = 'swim'
edible = False
summer = Chicken()
print(summer.feather)
summer.chirp('ji')
print(summer.how_to_move)
True
ji
walk
新定义的鸡(Chicken)类,增加了两个属性:移动方式(how_to_move)
和可以食用(edible)
在类定义时,括号里为Bird,这说明,鸡类是属于鸟类(Bird)的一个子类
即Chicken继承自Bird,子类Chicken将享有父类Bird的所有属性
2.属性覆盖
如上所述,在继承的过程中,我们可以在子类中增加父类不存在的属性,从而增强子类的功能
此外,我们还可以在子类中替换父类已经存在了的属性,如:
class Bird(object):
def chirp(self):
print('make sound')
class Chicken(Bird):
def chirp(self):
print('ji')
bird = Bird()
bird.chirp()
summer = Chicken()
summer.chirp()
make sound
ji
鸡类(Chicken)是鸟类(Bird)的子类,在鸡类(Chicken)中
我们定义了方法chirp(),这个方法在鸟类中也有定义
通过调用可以看出,鸡类会调用自己定义的chirp()方法
而不是父类中的chirp()方法,从效果上看,就好像父类中的方法
被子类中的同名属性覆盖(override)了一样
通过对方法的覆盖,我们可以彻底改变子类的行为,但有的时候
子类的行为是对父类行为的拓展,这时,我们可以通过super关键字
在子类中调用父类中被覆盖的方法,比如:
class Bird(object):
def chirp(self):
print('make sound')
class Chicken(Bird):
def chirp(self):
super().chirp()
print('ji')
bird = Bird()
bird.chirp()
summer = Chicken()
summer.chirp()
make sound
make sound
ji
在鸡类的chirp()方法中,我们使用了super,它是一个内置类
能产生一个指代父类的对象,通过super,我们在子类的同名方法中调用了父类的方法
这样,子类的方法既能执行父类中的相关操作,又能定义属于自己的额外操作
调用super的语句可以出现在子类方法的第一句
也可以出现在子类方法的任意其他位置