6.1:类与对象
类、对象
实例:增删改查
6.2:类调用方式
普通调用方式:
静态属性
类方法
类的工具包
6.3: 三大特性: 继承,封闭,派生
继承顺序:mro
子类调用父类的方法
supper()
多态
封装
私有属性
6.4: 常用术语
合成
派生/继承/继承结构
泛化/特化
多态与多态性
自省/反射
python是一门面向对象编程语言,其中编程方式分为三种范式:
1、面向过程编程
2、函数式编程
分为两种:数学层次的编程与python函数式编程
3、面向对象编程
对象是由类产生的具体存在
6.1: 类与对象
什么是类:
类:把一类事物的相同的特征和动作整合到一起就是类,类是一个抽象的概念
什么是对象:
对象:就是基于类而创建的一个具体的事物(具体存在的),也是特征和动作整合到一起。
面向对象设计: 把一类事物的相同的数据和动作整合到一起,即是面向对象设计
|
面向对象编程: 用定义类+实例/对象的方式去实现面向对象的设计
类:
class |
# 在python3中,上述两种定义方式全都是新式类
class.__dict__ 查看类的属性字典
class |
结果:
请输入名称: xx |
实例:指的是类生成的某个对象,调用 __init__ 的过程
实例应当具备类的特征以及数据属性
实例没有函数属性, 函数属性只属于类
实例只建议使用查,不建议修改或增加函数。
# 创建一个类
class |
# 说明
# self: 调用实例属性
# cls: 调用类属性
6.2:类调用方式
# 普通调用方式:
class |
静态属性: 将函数封闭成数据属性的格式,调用时可直接忽略执行时的逻辑
# 错误的调用方式
@property |
# 正确调用方式: 静态属性,调用方式像数据属性一样调用就行。
@property |
# 类方法: 不跟具体实例捆绑,只跟类捆绑使用, 不需要实例化,直接用类就可以使用
class |
# 类的工具包, 不跟类绑定,也不跟具体实例绑定
@staticmethod 跟类跟实例都没有关系
@staticmethod |
# 不带self,cls的调用方式与类工具包的区别
def |
# 类工具与普通函数,使用字典查看它俩的区别
'info_sta' |
三大特性: 继承,封闭,派生
# 继承 子类会继承父类的所有属性,如果子父有相同的数据或方法,子类不会覆盖父类的任何数据
class |
# 接口继承 ---------------------------------------------------------------------------------------
class |
# 上面的代码只是看起来像接口,其实并没有起到接口的作用,子类完全可以不用去实现接口 ,这就用到了抽象类
# 接口继承、抽象类:定义一个基类,基类当中把自己的方法定义成接口函数,只要来一个子类,那么子类必须实现它的方法才能执行
1 什么是抽象类
与java一样,python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化
2 为什么要有抽象类
如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性。
比如我们有香蕉的类,有苹果的类,有桃子的类,从这些类抽取相同的内容就是水果这个抽象的类,你吃水果时,要么是吃一个具体的香蕉,要么是吃一个具体的桃子。。。。。。你永远无法吃到一个叫做水果的东西。
从设计角度去看,如果类是从现实对象抽象而来的,那么抽象类就是基于类抽象而来的。
从实现角度来看,抽象类与普通类的不同之处在于:抽象类中只能有抽象方法(没有实现功能),该类不能被实例化,只能被继承,且子类必须实现抽象方法。这一点与接口有点类似,但其实是不同的,即将揭晓答案 来源于: http://www.cnblogs.com/linhaifeng/articles/7340153.html
import |
# 继承顺序:
py2分深度和广度优先,
Py3只有广度优先
# 深度优先: 从左开始查找,一直到类的最深处
# 广度优先: 从左开始不找到最后,然后从右开始找到最后
MRO: 方向解析顺序
# 方法示例: F --> C --> B --> A
--> E --> D --> A
class |
1.子类会先于父类被检查
2.多个父类会根据它们在列表中的顺序被检查
3.如果对下一个类存在两个合法的选择,选择第一个父类
# 继承顺序 查看 print(F.__mro__):
# ( |
# 子类调用父类的方法
class |
# supper(). 继承父类,使用直接supper().方法, 当父类名改变之后,只需要更改类的父类名,不需要更改代码的逻辑
# 使用supper 的好处: 当父类名更改时,程序代码不需要理性,并且不需要再传递self参数
class |
# 什么是多态: 由不同的类实例化得到的对象,调用同一个方法,执行的逻辑不同
# 多态的概念指出了对象如何通过他们共同的属性和动作来操作及访问,而不需考虑他们具体的类 如len
# 多态是由继承体现的一种方式
# 多态
# 类的继承有两层意义: 1、改变 2、扩展
# 多态的就是类的这两层意义的一个具体的实现机制即、调用不同的类实例化得对象下的相同的方法,实现的过程不一样
# python中的标准类型就是多态概念的一个很好的示范
class |
# 由不同的类实例化得到的对象,调用同一个方法,执行的逻辑不同
|
# 封装
# class类似于口袋,数据属性跟方法就类似于口袋中的一些物品
class |
# 调用封装属性
from |
# 约定规则,不要使用约定的隐藏属性
_ : python当中的约定,只要属性是单下划线下头的,就表示是一个隐藏属性, 外部无法调用,(其实外部可以调用,这只是py的一种约定,_表示不要使用这种属性内容)
print |
__ : python会自动重命名为 _classname__属性名,
# 直接使用这个数据属性,一看认为它就是一个隐藏属性,无法调用其实不然
print |



