python面向对象再读
综述
说明
此文档写于22.3.4,是对过去知识体系结构下的python开发的提升,在面向对象方面通过阅读得到的很有意思的东西,一些自己的看法和想法。
目标、原则和模式
面向对象的设计目标
- 健壮性
- 适应性
- 可重用性
面向对象的设计原则
-
模块化
-
抽象化
抽象数据结构
(Abstract Data Types,ADT)
规定了数据存储的类型。支持的操作和操作参数的类型Python用了一种称为抽象基类
(Abstract Base Class,ABC)
的机制来支持抽象数据类型 -
封装
软件系统的不同组件不应显示其各自实现的内部细节
封装的主要优点之一就是它给程序员实现组件细节的自由
按照惯例,以单下划线开头的类成员(数据成员和成员函数)的名称被认定为非公开的
设计模式
- 算法
- 迭代器
- 适配器
- 位置
- 合成
- 定位器
- 工厂模式
编码风格和文档
主要原则如下:
-
Python代码块通常缩进4个空格
-
标识符命名要有意义
- 类应该一首字母大写的单数名词作为名字,当出现多个单词里那句而在一起形成一个类的名字时,他们应该遵循所谓的“驼峰拼写法”规则。即在该规则中,每个单词的首字母要大些
- 函数,包括类的成员函数,应该小写。如果多个单词组合起来,就应该用下划线隔开
(例如,make_payment)
,如果函数的唯一目的是返回一个值,那么函数名可以是一个描述返回值的名词。 - 标识某个对象的名字应该是一个小写的名词,但是我们使用一个大写字母来表示一个数据结构的名称时候会不遵循这条规则
- 传统上用大写字母并用下划线隔开每个字母的标识符代表一个常量值
(MAX_SIZE)
-
用注释给程序添加说明,解释有歧义或令人困惑的结构
测试与调试
测试时我们应该考虑如下输入:
- 序列具有零长度(没有元素)
- 序列中有一个元素
- 序列中所有元素都是相同的
- 序列中已排序
- 序列已反向排序
命名空间
当我们定义一个类的时候,这个类将开辟一个命名空间,但是当我们用类去构造一个实例的时候,这个实例将拥有自己的命名空间,以防止不同命名空间的错乱访问
名词解析与动态调度
Python解释器开始一个名称解析过程:
-
在实例命名空间中搜索,如果找到所需的名称,关联值可以直接引用
-
否则在该实例所属的类的命名空间中搜索,如果找到,则使用
-
否则搜索仍在继续,通过继承层次结构向上,检测没一个父类的类名称空间(通常通过检查超类,接着是超类的超类,等等)。第一次找到这个名字,他的关联值就可以使用
-
如果还是没有,则抛出异常
慢即是快,细则是能,于小处铸迤逦