创建自定义对象
1、对象魔法
对象:一系列数据(属性)以及一套访问和操作这些数据的方法。
多态:可对不同类型的对象执行相同的操作
封装:对外部隐藏有关对象工作原理的细节
继承:可基于通用类创建出专用类
1.1 多态与方法
即便你不知道变量指向的是哪种对象,也能够对其执行操作,且操作的行为将随对象所属的类型(类)而异。
与对象属性相关联的函数称为方法。
1.2 封装与属性
属性是归属于对象的变量
属性描述对象的状态
属性能被对象的方法修改
总结:对象将一系列函数(方法)组合起来,并赋予它们访问一些变量(属性)的权限,而属性可用于在两次函数调用之间存储值。
1.3 继承
子类具有父类的所有属性和方法,且其或有易于父类的属性和方法
2、类
2.1 类是什么
类——一种对象。
每个对象都属于特定的类,并被称为该类的实例。
类由其支持的方法定义。
子类(subclass)
超类(superclass)
2.2 创建自定义类
![](https://i-blog.csdnimg.cn/blog_migrate/0c70bb7f6b49659a753744bd81858a07.png)
2.3 属性、函数和方法
方法(关联的方法)将其第一个参数(self)关联到它所属的实例,因此无需提供这个参数。
2.4 隐藏
要让方法或属性称为私有的(不能从外部访问),只需让其名称以两个下划线打头即可。
私有属性不能从对象外部访问,而只能通过存取器方法(如get_name和set_name)来访问。
注意:
在类定义中,对所有以两个下划线打头的名称都进行转换,即在开头加一个下划线和类名,就能从类外访问私有方法。
![](https://i-blog.csdnimg.cn/blog_migrate/203562ca6d37d3a74e7c5e057bf68e81.png)
如果你不希望名称被修改,又想发出不要从外部修改属性或访问方法的信号,可用一个下划线打头,这是一个约定。
2.5 类的命名空间
在class语句中定义的代码都是在一个特殊的命名空间(类的命名空间)内执行,而类的所有成员都可访问这个命名空间。
![](https://i-blog.csdnimg.cn/blog_migrate/47928957f7a0813aab1c2c904f78991b.png)
2.6 指定超类
要指定超类,可在class语句中的类名加上超类名,并将其用圆括号括起。
2.7 深入讨论继承
要讨论一个类是否是另一个类的子类,可使用内置方法issubclass
![](https://i-blog.csdnimg.cn/blog_migrate/a4279892418b3cd87c225af3a21e5d82.png)
如果你有一个类,访问其特殊属性__bases__可以知道它的基类
![](https://i-blog.csdnimg.cn/blog_migrate/c1da5e95b1a9e31fcb7c8e5932ba442e.png)
要确定对象是否是特定类的实例,可使用isinstance
![](https://i-blog.csdnimg.cn/blog_migrate/318229c9f83804ccc723605d101ef1ba.png)
如果你想要获悉对象属于哪个类,可使用属性__class__
![](https://i-blog.csdnimg.cn/blog_migrate/7af2a30988e47d92909aac2613974136.png)
type(s)也可以获悉其所属的类
![](https://i-blog.csdnimg.cn/blog_migrate/f878cb45e5a5768303a92615652b5b8d.png)
2.8 多个超类
多重继承。
![](https://i-blog.csdnimg.cn/blog_migrate/656761d3eda61dd7d7e11a9e946cc3fe.png)
多个超类的超类相同时,查找特定方法或属性时访问超类的顺序称为方法解析顺序(MRO)。
一种常见的做法是使用一个核心超类以及一个或多个混合超类。
2.9 接口和内省
对象遵循特定的接口(即实现特定的方法)
![](https://i-blog.csdnimg.cn/blog_migrate/74918e066ecc210d4af9fb236d2625a3.png)
2.10 抽象基类
Python通过引入模块abc为所谓的抽象基类提供支持。
![](https://i-blog.csdnimg.cn/blog_migrate/a5d84a46b371ee7002bef874ce150b4c.png)
3、面向对象设计
要确定需要哪些类以及这些类应包含哪些方法时,可以这样做:
1、将有关问题的描述(程序需要做什么)记录下来,并给所有的名称、动词和形容词加上标记
2、在名词中找出可能的类
3、在动词中找出可能的方法
4、在形容词中找出可能的属性
5、将找出的方法和属性分配给各个类
改进模型
1、记录(或设想)一系列用例。
2、透彻而仔细地考虑每个场景,确保模型包含了所需的一切。