Python面向对象(继承、多态、封装、传参方式、鸭子类型、局部变量)

Python面向对象:

1.类的属性可以通过实例化对象动态添加

2.传参方式:
1)所谓模子就是类抽象的

2)对象 = 类名()

3)过程:
(1)类名():首先会创造出一个对象,创建了一个self变量
(2)调用init方法,类名括号里的参数会被这里接收
(3)执行init方法
(4)返回self对象,self就是一个特殊的大字典
Python面向对象(继承、多态、封装、传参方式、鸭子类型、局部变量)
Python面向对象(继承、多态、封装、传参方式、鸭子类型、局部变量)
Python面向对象(继承、多态、封装、传参方式、鸭子类型、局部变量)

3.类中的局部变量,可变数据类型修改是共享的,不可变数据类型修改仅限于实例化对象
Python面向对象(继承、多态、封装、传参方式、鸭子类型、局部变量)
类中的局部变量可以通过类名来访问
Python面向对象(继承、多态、封装、传参方式、鸭子类型、局部变量)
4.一个类的定义不一定要__init__

5.面向对象的三大特性:继承,多态,封装

6.组合:一个对象的属性值是另外一个类的对象,类的实例化对象可以做类的属性

7.类的继承:
Python面向对象(继承、多态、封装、传参方式、鸭子类型、局部变量)

多继承:一个类继承多个父类 路径:A -> B -> C
Python面向对象(继承、多态、封装、传参方式、鸭子类型、局部变量)

钻石继承:被继承的两个类继承同一个类
Python面向对象(继承、多态、封装、传参方式、鸭子类型、局部变量)

漏斗继承:被继承的两个类分别继承不同的类
Python面向对象(继承、多态、封装、传参方式、鸭子类型、局部变量)

(1)经典类深度优先 python2.7新式经典共存,新式类要继承object
(2)新式类广度优先 python3.7只有新式类,默认继承object, mro, super方法只有新式类中有,super只在python3.7中有
(3)super的本质:不是直接找父类,而是根据调用者的节点位置的广度优先顺序来的

菱形继承:
Python面向对象(继承、多态、封装、传参方式、鸭子类型、局部变量)
Python面向对象(继承、多态、封装、传参方式、鸭子类型、局部变量)

接口类和抽象类:

1、抽象类规范
一般情况下单继承能实现的功能都是一样的,所以在父类中可以有一些简单的基础实现
多继承的情况,由于功能比较复杂,所以不容易抽象出相同的功能的具体实现写在父类中

2、抽象类还是接口类:面向对象的开发规范
(1)python中没有接口类:java里有接口Interface这个概念
(2)python中自带多继承,所以我们直接用class来实现了接口类
(3)python中支持抽象类:一般情况下单继承不能实例化
(4)多态python天生支持多态(动态强类型的语言)

3、鸭子类型
(1)不崇尚根据继承所得来的相似
(2)我只是自己实现自己的代码就可以了
(3)如果两个类刚好相似,并不产生父类的子类的兄弟关系,而是鸭子类型
例:tuple list 这种相似是自己写代码时约束的,而不是通过父类约束的
(4)优点:松耦合 每个相似的类之间都没有影响

接口类
python不支持,默认是多继承,所有方法都必须不能实现
Python面向对象(继承、多态、封装、传参方式、鸭子类型、局部变量)
抽象类:
python支持,不支持多继承
Python面向对象(继承、多态、封装、传参方式、鸭子类型、局部变量)

静态方法:
在完全面向对象的程序中,如果一个函数既和对象没有关系也和类没有关系那么就用staticmethod将这个函数变成一个静态方法
Python面向对象(继承、多态、封装、传参方式、鸭子类型、局部变量)

封装:
1、广义上面向对象的封装:代码的保护,面向对象的思想本身就是一种封装
2、只让自己的对象能调用自己类的方法
3、狭义上的封装 – 面向对象三大特性
4、属性和方法都藏起来,不让你看见

Testcase:
1.下面代码输出结果为: # 20, 10, None
Python面向对象(继承、多态、封装、传参方式、鸭子类型、局部变量)
2.求字符串中数字的和:
Python面向对象(继承、多态、封装、传参方式、鸭子类型、局部变量)
3.输出值为list类型的key组成一个list:
Python面向对象(继承、多态、封装、传参方式、鸭子类型、局部变量)
4.匹配方式
Python面向对象(继承、多态、封装、传参方式、鸭子类型、局部变量)
上面的开头匹配错了(多选一开头匹配)
Python面向对象(继承、多态、封装、传参方式、鸭子类型、局部变量)