设计模式:Python实现笔记1
基本语法
Python是一种动态语言,定义变量时不需要在前面加类型说明,而且不同类型之间可以方便地相互转换。Python有五个标准的数据类型:
(1)Numbers(数字) (2)String(字符串)(3)List(列表)(4)Tuple(元组)
(5)Dictionary(字典)
其中 List[]、Tuple()、Dictionary {}为容器。Python 支持四种不同的数字类型:int(有符号整型)、float(浮点型)、complex(复数)(说明:Python 3中已去除long类型,与int类型合并)。
每个变量在使用前都必须赋值,变量赋值以后才会被创建。
类的定义
使用class语句来创建一个新类,class之后为类的名称并以冒号结尾,类的帮助信息可以通过 ClassName._doc_查看,类体(class_suite)由类成员、方法、数据属性组成,举例如下。
其中_init_为初始化函数,相当于构造函数。
1)访问权限
● _foo_:定义的是特殊方法,一般是系统定义名字,类似_init_()。
● _foo:以单下画线开头时表示的是 protected 类型的变量,即保护类型只允许其本身与子类进行访问,不能用于 from module import *。
● __foo:以双下画线开头时,表示的是私有类型(private)的变量,即只允许这个类本身进行访问。
2)类的继承
Python中继承中的一些特点:
(1)在继承中基类的初始化方法_init_()不会被自动调用,它需要在其派生类的构造中亲自专门调用。
(2)在调用基类的方法时,需要使用super()前缀。
(3)Python总是首先查找对应类型的方法,不能在派生类中找到对应的方法时,它才开始到基类中逐个查找(先在本类中查找调用的方法,找不到才去基类中找)。
如果在继承元组中列了一个以上的类,那么它就被称作“多重继承”。
3)基础重载方法
Python的类中有很多内置的基础重载方法,我们可以通过重写这些方法来实现一些特殊的功能。这些方法如表0-1所示。
表0-1 基础重载方法
UML(统一建模语言)
UML是英文 Unified Modeling Language 的缩写,简称UML(统一建模语言),它是一种由一整套图组成的标准化建模语言,用于帮助系统开发人员阐明、设计和构建软件系统。
UML 的这一整套图被分为两组,一组叫结构性图,包含类图、组件图、部署图、对象图、包图、组合结构图、轮廓图;一组叫行为性图,包含用例图、活动图(也叫流程图)、状态机图、序列图、通信图、交互图、时序图。其中类图是应用最广泛的一种图,经常被用于软件架构设计中。
类图用于表示不同的实体(人、事物和数据),以及它们彼此之间的关系。该图描述了系统中对象的类型以及它们之间存在的各种静态关系,是一切面向对象方法的核心建模工具。
UML 类图中最常见的几种关系有:泛化(Generalization)、实现(Realization)、组合(Composition)、聚合(Aggregation)、关联(Association)和依赖(Dependency)。这些关系的强弱顺序为:泛化=实现 > 组合 > 聚合 > 关联 > 依赖。
1.泛化
泛化(Generalization)是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。
如:哺乳动物具有恒温、胎生、哺乳等生理特征,猫和牛都是哺乳动物,也都具有这些特征,但除此之外,猫会捉老鼠,牛会耕地,如图0-1所示。
2.实现
实现(Realization)是一种类与接口的关系,表示类是接口所有特征和行为的实现。
如:蝙蝠也是哺乳动物,它除具有哺乳动物的一般特征之外,还会飞,我们可以定义一个IFlyable的接口,表示飞行的动作,而蝙蝠需要实现这个接口,如图0-2所示。
图0-2 实现
3.组合
组合(Composition)也表示整体与部分的关系,但部分离开整体后无法单独存在。因此,组合与聚合相比是一种更强的关系。
如:我们的电脑由CPU、主板、硬盘、内存组成,电脑与CPU、主板、硬盘、内存是整体与部分的关系,但如果让CPU、主板等组件单独存在,就无法工作,因此没有意义,如图0-3所示。
4.聚合
聚合(Aggregation)是整体与部分的关系,部分可以离开整体而单独存在。
如:一个公司会有多个员工,但员工可以离开公司单独存在,离职了依然可以好好地活着,如图0-4所示。
5.关联
关联(Association)是一种拥有关系,它使一个类知道另一个类的属性和方法。关联可以是双向的,也可以是单向的。
如:一本书会有多个读者,一个读者也可能会有多本书,书和读者是一种双向的关系(也就是多对多的关系);但一本书通常只会有一个作者,是一种单向的关系(就是一对一的关系,也可能是一对多的关系,因为一个作者可能会写多本书),如图0-5所示。
6.依赖
依赖(Dependency)是一种使用的关系,即一个类的实现需要另一个类的协助,所以尽量不要使用双向的互相依赖。
如:所有的动物都要吃东西才能活着,动物与食物就是一种依赖关系,动物依赖食物而生存,如图0-6所示。
Python的对象模型
对象是内存中的一个单元,包括数值和相关操作的集合。
对象是Python语言中最基本的概念,在Python中处理的每样东西都是对象。Python中还有一些基本概念,它们的关系如下:
(1)程序由模块构成;
(2)模块包含语句;
(3)语句包含表达式;
(4)表达式建立并处理对象。
Python中有许多内置对象可供编程者使用。有些内置对象可直接使用,如数字、字符串、列表、del等,如表1-1所示;有些内置对象需要导入模块才能使用,如正弦函数sin(x)、随机数产生函数random( )等。
python中的常用内置函数如表
常用操作符如表,在用表达式进行运算时,要善于用小括号指定运算的顺序。
单独的对象也称为表达式,如True 、x等。
python中的常用内置函数如下表
模块的导入
导入1个模块之后,就能使用模块中的函数和类。导入模块使用import语句,有3种用法。
1.导入整个模块
一般格式为:
import 模块名1[, 模块名2[,...]]
模块名就是程序文件的前缀,不含“.py”,可一次导入多个模块。导入模块之后,调用模块中的函数或类时,需要以模块名为前缀,程序的可读性好。如:
>>> import math
>>> math.sin(0.5)
0.479425538604203
2.与from联用导入整个模块
一般格式为:
from 模块名 import*
这种方式导入模块之后,调用模块中的函数或类时,仅使用函数名或类名,简洁但程序的可读性稍差。如:
>>> from math import *
>>> cos(0.5)
0.8775825618903728
3.与from联用导入1个或多个对象
一般格式为:
from 模块名 import 对象名1[, 对象名2[,...]]
这种方式只导入模块中的1个或多个对象,调用模块中的对象时,仅使用对象名。如:
>>> from math import exp , sin, cos
>>> exp(1)
2.718281828459045
>>> sin(0.5)
0.479425538604203
>>> cos(0.5)
0.8775825618903728
Python中的常用模块如下表