目录
面向对象
- 面向对象是一种代码封装的方法,主要思想就是将相关的数据和实现的函数给封装到一起。它是一种高级的编程思想,学好它,就可以向造物者创造世界一样创造自己的程序
- 对象=属性+方法(对象的静态特征称为属性,对象能做的事情称为方法。所谓的属性就是写在类里面的变量,所谓的方法就是写在类里面的函数)
- 对象诞生前,要先创造一个类(class),再通过 类 来创造实际的对象【通俗讲:先创造一个模具,再根据模具进行批量生产】
- 类和对象其实就是模拟现实世界的设计
发现写在turtle类里的函数的参数都是self: 函数放到类里面,必须加上self参数。类中的每一个方法默认的第一个参数都是self,self是实例对象本身
1. 封装
- 封装是面向对象编程的三个基本特征之一,另外两个是继承和多态。
- 封装:就是在创建对象之前,通过类将相关的属性和方法给打包到一起,然后通过类来生成相应的对象
- 像前面我们定义turtle类的时候,把甲鱼的特征属性和行为能力给封装到一起,并且可以给甲鱼添加更多的相关属性,使turtle看起来更像一个真正意义上的甲鱼(要注意:不要把不相关的属性和方法放在一起)
python到处是对象何以见得:例如 x=520,x就是一个整数类的实例对象;y="fish",y就是一个str类的实例对象
2.1继承
python的类支持继承,它可以使用现有类的所有功能,并在无需重新编写代码的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”,被继承的类称为“父类or基类or超类”
判断对象是否属于某个类:isinstance()函数,这是一个BIF
检测一个类是否为某个类的子类:issubclass()函数
2.2多重继承
python的类支持多重继承,也就是一个子类同时可以继承多个父类
3.组合
4. 绑定
- 类的实例对象很多,但是这些实例对象是共享类里面的方法,所以当调用实例c.get_self()的时候,实际含义是调用类C的get_self()方法,并将实例对象作为参数给传递进去,进而实现绑定
- 在实例中,除了类的方法是共享之外,实例的属性可以是自己的。
- 给实例对象添加属性,可以直接使用点号加上属性名称即可
- python是一门支持内省的编程语言,他的对象在运行的时候具有自我观察的能力 ,想知道对象拥有哪些属性,可以通过__dict__进行内省
- 类和对象的属性是通过字典进行存放的
- 类和对象并不是必要的,因为几乎所有的实现不使用面向编程也能够实现,并且有时候代码的执行效率可能更高。
5.构造函数
构造函数有一个特殊的名称叫__init__(),在类中定义__init__()方法,就可以在实例化对象的同时实现个性化定制
6.重写
如果对于父类的某个属性或某个方法不满意的话,完全可以重新写一个同名的属性或方法对其进行覆盖,这种行为称为子类对父类的重写
解决钻石继承的方法:supper函数(能在父类中搜索指定的方法,并自动绑定好self参数)
使用super 函数查找父类方法,它就会自动按照MRO顺序去搜索父类的相关方法,并且自动避免重复调用问题
注意:如果出现同名的属性或方法,python会有一个明确的查找覆盖顺序,这个顺序就叫MRO(method resolution order方法解析顺序)。要查找一个类的MRO有两种方法,一种是通过MRO方法,另一种是通过MRO属性
7. MIXIN
minxin就是mix-in,是一种设计模式,学习设计模式就是教你打组合拳
注:设计模式就是利用编程语言已有的特性,针对面向对象开发过程中反复出现的问题而设计出来的解决方案
代码解析:先定义了一个叫animal的类,这个类有构造函数,构造函数需要传入名字和年龄,之后还有一个say的方法;又定义了一个pig类,继承animal类,接着用pig类实例化一个对象p,名字叫小鬼,6岁,调用say方法和special方法得到以上结果
在不修改原有类的代码的结构下,让小鬼飞起来:可以写一个功能是“起飞”的类,通过多继承的方式,写到pig的一个父类即可。(继承一个类,就能使用这个类里面的方法和属性,就像pig类继承animal类的时候,就可以使用say方法,而且pig在实例化的时候也使用了animal 的构造函数),
8.多态
多态是面向对象的基本特征之一,它是指同一个运算符、函数或对象在不同场景下具有不同的作用效果的技能
拿运算符举例说明多态
3+5得8
字符串的加法是拼接
3*5得15
字符串的乘法是重复
python的一些函数也支持多态
len()函数:功能是获取一个对象的长度
如果传入的是字符串,得到的就是传入字符串对象的字符个数
如果传入的是列表,得到的是列表中元素的个数
如果传入的是字典,得到的是字典中键的个数
类继承的多态:python允许我们在子类中定义和父类同名的方法,就是说如果我们对父类的某个方法不满意,完全可以在子类中重新定义一个同名的方法进行覆盖,这种操作叫重写,重写就是实现类继承的多态