Python 【面向对象:继承】

前面的两篇讲了面向对象的第一个特性:封装
今天来讲讲面向对象的第二个特性:继承
继承分为单继承以及多继承

先给出一个例子,看看继承与非继承的区别:
在这里插入图片描述这是没有使用继承的程序:

#不使用继承
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()

那么结果就为

老虎头上有“王”
老虎是森林之王
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值