面向对象
2018-07-31 11:38:45 11 举报
AI智能生成
面向对象
作者其他创作
大纲/内容
面向过程
面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西
优点是:极大程序的降低了程序的复杂度
面向对象
面向对象的核心是对象(上帝式思维)
特征和技能的结合体就是对象
优点:解决了程序的扩展性,对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的牲和技能修改都很容易
缺点:可控性差,无法向面向过程的程序设计流水线式的可以精准的预测问题的处理流程和结果<span><font color="#000000">面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。</font></span><br>
面向对象分析 OOA
<strong><span>object oriented analysis ,OOA</span></strong>
面向对象维护OOSM
<strong><span>object oriendted soft maintenance,OOSM</span></strong>
面向对象的程序设计OOD
<strong><span>object oriented design,OOD</span></strong>
面向对象测试OOT
找对象->找类(归纳对象相同的特征与技能,还有每个对象独有的特征)
<strong><span>object oriented test,OOT</span></strong>
面向对象编程OOP
先定义类->实例化出对象
<strong><span>object oriented programming,OOP</span></strong>
类
<strong>所有对象都具有的特征和技能的结合体</strong>
类名首字母大写
类的类型
新式类
继承object的类
__bases__查看父类
经典类
py2默认为经典类
属性
特征(变量)
通常不可变
技能(方法)
__init_(self)
独有的特征
绑定函数
用法:
属性引用
类名.的方式调用变量和函数
实例化对象
名称空间
s.__dict__
对象
对象也称为实例
属性
对象本身就只有特征(变量)
用法
属性引用
名称空间
s1.__dict__
绑定方法
核心在于绑定,唯一绑定一个确定的对象
对象之间的交互
接口与归一化设计
父类定义接口子类实现功能
限定子类必须实现哪些方法
抽像类
本质还是类,与类的区别在于,加了装饰器的函数,子类必须实现它们
<strong><span>抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化</span></strong>
import abc
@abc.abstractmethon
三大特性
继承派生组合
继承
<span>继承是一种创建新的类的方式</span>
作用
<span>继承基类的方法,并且做出自己的改变或者扩展(代码重用)</span>
<span>声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能</span>
继承顺序
新式类
广度优先
obj.mro()
一个简单的所有基类的线性顺序列表
准则
子类会先于父类被检查
多个父类会根据它们在列表中的顺序被检查
如果对下一个类存在两个合法的选择,选择第一个父类
obj.__mro__
同上
经典类
深度优先
子类调用父类的方法
父类名.父类方法()
super()
<span>当你使用super()函数时,Python会在MRO列表上继续搜索下一个类。只要每个重定义的方法统一使用super()并只调用它一次,那么控制流最终会遍历完整个MRO列表,每个方法也只会被调用一次(</span><span><strong><span>注意注意注意:使用super调用的所有属性,都是从MRO列表当前的位置往后找,千万不要通过看代码去找继承关系,一定要看MRO列表</span></strong></span><span>)</span>
经典类
super(自己的类名,self).父类的方法()
多态
同一种事物的不同形态
派生
在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类。
组合
<strong><font color="#000000">在一个类中以另外一个类的对象作为数据属性,称为类的组合</font></strong><br>
老师学生与课程
老师学生与生日
类与类之间有的关系
封装
为什么要用封装
封装数据的主要原因是保护隐私
封装方法的主要原因是隔离复杂度
封装分为两个层面
<strong><span>第一个层面的封装(什么都不用做):创建类和对象会分别创建二者的名称空间,我们只能用类名.或者obj.的方式去访问里面的名字,这本身就是一种封装</span></strong>
<strong>第二个层面的封装:类中把某些属性和方法隐藏起来(或者说定义成私有的),只在类的内部使用、外部无法访问,或者留下少量接口(函数)供外部访问。</strong>
<em><span><strong>在python中用双下划线的方式实现隐藏属性(设置成私有的)</strong></span></em>
<strong>1.类中定义的</strong><strong>__x只能在内部使用,如self.__x,<strong><strong>引用的就是变形的结果</strong></strong>。</strong>
<strong><strong>2.这种变形其实正是针对外部的变形</strong><strong>,在外部是无法通过__x这个名字访问到的。</strong></strong>
<strong>3.在子类定义的__x不会覆盖在<strong>父类定义的__x,因为子类中变形成了:_子类名__x,而父类中变形成了:_父类名__x,即双下滑线开头的属性在继承给子类时,子类是无法覆盖的。</strong></strong>
<strong>4.这种机制也并没有真正意义上限制我们从外部直接访问属性,知道了类名和属性名就可以拼出名字:_类名__属性,然后就可以访问了,如a._A__N</strong>
<strong>5.变形的过程只在类的定义是发生一次,在定义后的赋值操作,不会变形</strong>
<strong>6.在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的</strong>
封装与扩展性
多态
多态
多态指的是一类事物有多种形态(一个抽象类有多个子类,因而多态的概念依赖于继承)
从定义层面
多态性
具有不同功能的函数,可以使用相同 的函数名,调用的逻辑一样,但执行的结果不一样。
向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(所谓消息就是调用函数)
优点
增加了程序的灵活性
增加了程序的可扩展性
装饰器
property
统一调用方法
封装
被property修饰的属性会优先于对象的属性被使用
用法
@property
@属性点.setter
赋值
@属性点.deleter
staticmethod
类的工具包
不绑定对象
但凡定义在类的内部并没有任何装饰器修饰的方法都是绑定议定有自动传值功能
但凡定义在类的内部并且被装饰器修饰的方法都是解除绑定的方法,实际就是函数
classmethod
第一个参数接收一个类绑定到类的方法
调用方法
把类本身当作第一个参数
类内部拿到cls的内存地址就可以调试或者实例化
总结
反射
通过字符串的形式操作对象的相关属性,python一切事物都是对象,都可以使用反射
hasattr()
getattr()
setattr()
delattr()
反射的应用
基于当前模块
实现可插拔动态模块导入
有就调用,没有执行其它逻辑
通过字符串导入模块
定制自己的数据类型
基于继承的原理,来定制自己的数据类型
授权方式实现定制数据类型
内置方法
attr系列
__setattr__
__getattr__
__delattr__
item系列
__setitem__
__getitem__
__delitem__
__slots__
固定类属性
迭代器协议
__iter__
__next__
查询
__doc__
__module__
__class__
析构方法
__del__
上下文管理协议
__enter__
__exit__
对象加()调用执行
__call__
元类 metaclass
type为元类,是所有类的类
自定制元类
控制类实例化的过程
其它
isinstance()
issubclass()
...
0 条评论
下一页
为你推荐
查看更多