面向对象编程
面向对象编程——-Object Oriented Programming(OOP)
Python面向对象编程三大特点:
- 数据封装
- 继承
- 多态
- 鸭子类型
1、数据封装
这里我们定义一个Cat类,每个实例都可以拥有name和age属性,我们可以调用内部方法来访问这些数据,这样就把数据封装起来了,这些封装数据的函数本身是与Cat类相关联的,我们称之为“类的方法”
|
|
封装的另外一个好处就是可以给Cat类再增加一个新的方法
|
|
2、继承
继承的好处时子类获得父类所有的功能,这里先定义一个Animal类
|
|
这里再定义Cat类和Dog类,它们都继承自Animal,Animal是Cat和Dog的父类(超类或基类),而Cat和Dog是Animal的子类。Cat和Dog继承Animal后自动获得了Animal类的run方法
|
|
这里我们给子类增加run方法,当子类和父类都存在run方法时,子类覆盖掉父类方法,所以输出是
Cat is running!
Dog is running!
|
|
3、多态
当我们定义class的时候就定义了一种数据类型,这里用isinstance()函数来判断对象是否是已知的类型
|
|
判断都为True,这里可以试下isinstance(c, Animal)是什么结果,Cat的实例c继承自Animal,所以c也是Animal类型
|
|
在继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看做是父类。但是,反过来就不行
Cat可以被看成Animal,但Animal不能被看成Cat
isinstance(c, Cat)
|
|
再编写一个函数来来理解多态,每当我们传入实例,就打印出各个类相应的结果
|
|
这里我们再增加Lion子类
|
|
Animal类型有run方法,只要传入的任意类型是animal类或者子类就会自动调用自己的run方法
鸭子类型
- 一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。也可以这样理解,并不关心对象是什么类型,到底是不是鸭子,只关心行为
我们再增加一个子类,它不是animal类型,只要它有一个run()方法就可以了(只关心它的行为,而不关心它到底是不是animal)
|
|
完整代码
|
|