一 面向对象入门
1.1 理解对象
- 对象可以指自然界中的任何事物
- 计算机为解决某个领域问题所采用的事物(自然界中的事物的模型化)
- 事物(对象)具有自身的特征或能力
- 计算机中的对象具有解决问题所需要的特征或能力
1.2对象的优越性
- 封装
将模型的特征和能力打包在一起
模型的改变由模型自身来完成,就像自然界中的事物一样
隐藏模型的细节,外界只能使用它,而不必/不能改变它 - 继承
符合自然界的分类规律
快速的代码重用 - 多态
子类可以继承父类的特征与能力,还可以通过自定义来修改其特征与能力
鸭子类型(duck typing)只要有调用者需要的属性,就可以调用,不需要接口 - 组合
一个模型可以由其他的模型组成
二 定义和使用类
2.1 类与实例之间的关系
定义类就是建立模型(模子/印章)
实例化类就是建立真实事物(产品/印章印出来的图案)
2.2 实例化步骤
- 调用_new_()方法创建实例
- new()自动从ob ject继承
- 调用_init_()方法对其初始化
- init()方法在类中定义
2.3 添加类说明
-紧跟类名行之后,以三音好包围的字符串
-查看类说明 类名 do c. help(类名)
2.4 新式类与经典类
-
-python 2.x 版本
默认为是经典类 继承object为新式类
-
-python 3.x 版本
默认为是经典类 继承object为新式类
-
区别
经典类继承为深度优先
新式类继承为广度优先
三 描述对象的特征
3.1 实例属性
- 类被实例化以后才会具有的属性
- 一般在_init_()方法中创建并初始化
- 直接使用即定义:self.<属性名>
- 引用方法:self.<属性名>
- self是用来代表类的实例的
- 类外用实例名,属性名方式定义和引用
- 相同类的不同实例其实例属性是不相关的
- 一般不建议在_init_()方法之外创建和初始化实例属性
- 一般不推荐类外定义和修改,修改可以单独定义方法
3.2 类属性
- 类定义后就存在,而且不需要实例化
- 类属性使得相同类的不同实例共同持有相同变量
3.3 私有属性
- 不提供限制属性访问的关键字(无法限制类的各种属性在类外直接访问)
- 使用 _开头的变量名加以标志,应该只有类对象及其子类能访问(非强制性)
3.4 特殊属性
- 保存对象的元数据
四 让对象具有能动性
具有能动性就是添加方法
4.1 类的方法的定义
def fun_name(self, ...):
pass
其中的参数self代表类的实例,在调用方法时由系统自动提供
方法定义时必须指明self参数
4.2 类的方法调用
- 与普通的函数调用类似
- 在类的内部调用:self.<方法名> (参数列表)
- 在类的外部调用:<实例名>.<方法名>(参数列表)
- 注:以上两种调用方法中,提供的参数列表中都不用包括self
4.3 类内方法相互调用
- 在一个类的内部方法之间是可以相应调用的
- 调用方法同上面所述的在类的内部调用方法
4.4 构造方法及其作用
- 构造方法就是前面课程提到和使用的__init__方法
- 构造方法的作用就是类实例化时初始化实例
- init()方法就是类实例化的第二步自动调用的函数
- 注意其方法名是固定的,但其参数同普通方法一样,至少应带有self参数
- 初始化实例包括:定义和初始化实例属性;或调用类的一些方法
- 构造方法可以带有除self外的其他各种参数(关键字参数、默认参数等)可以达到在实例化类时,为相应的属性传入指定的值
4.5 提醒
- 本节课所定义的都是类的实例化方法,和实例属性一样,必须进行类实例化之后,才能存在和调用他们
- 这里使用的是python3.x 版本,print是一个函数
五 深入类的属性
5.1 同名的类属性与实例属性
- 以实例名,属性名引用时,优先引用实例属性
- 以类名,属性名引用时,只能引用类属性
5.2 属性访问的特殊方法(反射)
提供用字符串来操作类的属性/方法的方式
主要工具函数: hasattr (obj_name,‘属性名’)
setattr (obj_name,‘属性名’,值)
getattr (obj_name,‘属性名’)
5.3 属性包装
将方法包装成属性,以隐藏相关实现
- 控制属性的类型或范围
- 虚拟属性(由其他属性处理后得来)
三种属性操作
- 可读:@property
- 可写:@.setter
- 可删:@.deleter
5.4 描述符
将实现特殊协议方法的类作为另一个类的类属性
用来拦截和控制属性访问并可以重复使用
协议方法:
- get()
- set()
- delete()
分类
- 数据描述符(实现全部协议方法)
- 非数据描述符(实现部分协议方法)
- 说明:所有类成员函数都是非数据描述符
同名的实例属性和非数据描述符(以方法为例)访问优先级
注意:只能在新式类中使用