面向对象编程---【继承和多态】


前言

跟着廖雪峰老师动手敲一敲,都是很简单易懂的例子。


一、遗传

从原有Class直接继承的Class为子类,原Class为父类。子类可以直接继承方法函数,相同方法函数可覆盖,还可增设新的方法函数。
例如:

class Animal(object):#父类
    def run(self):
        print('Animal is running...')

class Dog(Animal):#子类
     pass

class Cat(Animal):#改变或增加功能

    def run(self):
        print('Cat is running...')#函数相同时,子类会覆盖父类

    def eat(self):
        print('Eating meat...')

a=Dog( )
c=Cat( )
a.run()
c.run()
c.eat()

运行结果:

Animal is running...
Cat is running...
Eating meat...

二、多态

1.子类类型不唯一

在继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看做是父类。但是,反过来是不成立的。
例如:

class Animal(object):#父类
    def run(self):
        print('Animal is running...')

class Dog(Animal):#子类
     pass

class Cat(Animal):

    def run(self):
        print('Cat is running...')
a=Dog( )
c=Cat( )
b=Animal()
print(isinstance(c,Cat),isinstance(c,Animal))#子类本就是父类的一种,所以c的类型有两种,isinstance()返回的是布尔值,判断类型是否一致
print(isinstance(b,Animal),isinstance(b,Cat))#但反之则不成立

运行结果:

True True
True False

2.开闭原则

我们用新增一个自定义函数和一个子类来解释经典的“开闭原则”:

class Animal(object):#父类
    def run(self):
        print('Animal is running...')

class Dog(Animal):#子类
     pass

class Tortoise(Animal):
    def run(self):
        print('Tortoise is running slowly...')

def run_twice(animal):
    animal.run()
    animal.run()

a=Dog( )
b=Animal( )
d=Tortoise( )
run_twice(b)
run_twice(a)
run_twice(d)

运行结果:

Animal is running...
Animal is running...
Animal is running...
Animal is running...
Tortoise is running slowly...
Tortoise is running slowly...

开闭原则:

  1. 对扩展开放:允许新增Animal子类;

  2. 对修改封闭:不需要修改依赖Animal类型的run_twice()等函数。

3.继承树

继承还可以一级一级地继承下来,就好比从爷爷到爸爸、再到儿子这样的关系。而任何类,最终都可以追溯到根类object,这些继承关系看上去就像一颗倒着的树。比如如下的继承树:
在这里插入图片描述

4.鸭子类型

在这里插入图片描述

“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”
在动态语言中,我们并不关心对象是什么类型,到底是不是鸭子,只关心行为。Python的“file-like object“就是一种鸭子类型。
就像:

class Animal(object):#父类
    def run(self):
        print('Animal is running...')

def run_twice(animal):
    animal.run()
    animal.run()

class Car(object):#并不是Animal的子类
    def run(self):#我们只需要保证传入的对象有一个run()方法就可以了
        print('Car is running rapidly')
e=Car()
run_twice(e)

运行结果:

Car is running rapidly
Car is running rapidly

再举个栗子,这个又容易理解一些:比如list.extend()方法中,我们并不关心它的参数是不是list,只要它是可迭代的,所以它的参数可以是list/tuple/dict/字符串/生成器…动态语言的魅力!!!


总结

争取把面向对象的高级用法在端午之前搞完。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值