前面的两篇讲了面向对象的第一个特性:封装
今天来讲讲面向对象的第二个特性:继承
继承分为单继承以及多继承
先给出一个例子,看看继承与非继承的区别:
这是没有使用继承的程序:
#不使用继承
class Animal :
def eat(self):
print('吃')
def drink(self):
print('喝')
def run(self):
print('跑')
def sleep(self):
print('睡')
class Dog :
def eat(self):
print('吃')
def drink(self):
print('喝')
def run(self):
print('跑')
def sleep(self):
print('睡')
def bark(self):
print('叫')
class Xiaotianquan :
def eat(self):
print('吃')
def drink(self):
print('喝')
def run(self):
print('跑')
def sleep(self):
print('睡')
def bark(self):
print('叫')
def fly(self):
print('飞')
animal = Animal()
dog = Dog()
xiaotianquan = Xiaotianquan()
print('这是Animal类')
animal.eat()
animal.drink()
animal.run()
animal.sleep()
print('')
print('这是Dog类')
dog.eat()
dog.drink()
dog.run()
dog.sleep()
dog.bark()
print('')
print('这是xiaotianquan类')
xiaotianquan.eat()
xiaotianquan.drink()
xiaotianquan.run()
xiaotianquan.sleep()
xiaotianquan.bark()
xiaotianquan.fly()
代码很长很麻烦也不利于阅读,这段代码的结果是:
这是Animal类
吃
喝
跑
睡
这是Dog类
吃
喝
跑
睡
叫
这是xiaotianquan类
吃
喝
跑
睡
叫
飞
接下来这是使用了继承的代码:
#使用继承
class Animal :
def eat(self):
print('吃')
def drink(self):
print('喝')
def run(self):
print('跑')
def sleep(self):
print('睡')
class Dog(Animal) :
def bark(self):
print('叫')
class Xiaotianquan(Dog) :
def fly(self):
print('飞')
animal = Animal()
dog = Dog()
xiaotianquan = Xiaotianquan()
print('这是Animal类')
animal.eat()
animal.drink()
animal.run()
animal.sleep()
print('')
print('这是Dog类')
dog.eat()
dog.drink()
dog.run()
dog.sleep()
dog.bark()
print('')
print('这是xiaotianquan类')
xiaotianquan.eat()
xiaotianquan.drink()
xiaotianquan.run()
xiaotianquan.sleep()
xiaotianquan.bark()
xiaotianquan.fly()
类的代码简易了很多,这段代码的结果是:
这是Animal类
吃
喝
跑
睡
这是Dog类
吃
喝
跑
睡
叫
这是xiaotianquan类
吃
喝
跑
睡
叫
飞
可以看到使用继承和不使用继承的结果一样,但是使用了继承,代码的可读性变强,也变得更短了
使用继承的时候,根据pycharm给出的智能提示,我们可以看到方法继承于哪里
比如我在调用dog的方法时出现了
在调用xiaotianquan的方法时出现了
我们再来看看多继承
代码为:
#多继承
#假设狮子和老虎的子嗣会继承老虎头上的“王”字,也会继承狮子的爆炸头
class Tiger :
def wang(self):
print('老虎的头上有“王”')
class Lion :
def baozhatou(self):
print('狮子有爆炸头')
class Tiger_Lion(Tiger, Lion) :
pass
baby = Tiger_Lion()
baby.wang()
baby.baozhatou()
结果为
老虎的头上有“王”
狮子有爆炸头
但是如果不同的父类之间存在同名的方法或者属性,就应该尽量避免使用多继承
来看个例子
代码:
#多继承
#更改括号内父类的顺序,继承的顺序也会发生改变
class Tiger :
def feature(self):
print('老虎头上有“王”')
def bark(self):
print('老虎是森林之王')
class Lion :
def feature(self):
print('狮子有爆炸头')
def bark(self):
print('狮子是森林之王')
#class Tiger_Lion(Tiger, Lion) :
# pass
class Tiger_Lion(Lion, Tiger) :
pass
baby = Tiger_Lion()
baby.feature()
baby.bark()
结果为
狮子有爆炸头
狮子是森林之王
但是如果更改括号内父类的顺序
#多继承
#更改括号内父类的顺序,继承的顺序也会发生改变
class Tiger :
def feature(self):
print('老虎头上有“王”')
def bark(self):
print('老虎是森林之王')
class Lion :
def feature(self):
print('狮子有爆炸头')
def bark(self):
print('狮子是森林之王')
class Tiger_Lion(Tiger, Lion) :
pass
#class Tiger_Lion(Lion, Tiger) :
# pass
baby = Tiger_Lion()
baby.feature()
baby.bark()
那么结果就为
老虎头上有“王”
老虎是森林之王