【Python编码规范】设计模式

本系列为《编写高质量代码-改善Python程序的91个建议》的读书笔记。

温馨提醒:在阅读本书之前,强烈建议先仔细阅读:PEP规范,增强代码的可阅读性,配合优雅的pycharm编辑器(开启pep8检查)写出规范代码,是Python入门的第一步。

建议50:利用模块实现单例模式

1)所有的变量都会绑定到模块;
2)模块只初始化一次;
3)import机制是线程安全的。

建议51: 用mixin模式让程序更加灵活

模板方法模式:在一个方法中定义一个算法的骨架,并将一些实现步骤延迟到子类中。

Python 中每一个类都有一个__base__属性,是一个元组,用来存放所有的基类,基类在运行中可以动态改变。

建议52:用发布订阅模式实现松耦合

发布订阅模式(publish/subscribe或pub/sub)是一种编程模式,消息的发送者(发布者)不会发送其消息给特定的接收者(订阅者),而是将发布的消息分为不同的类别直接发布,并不关注订阅者是谁。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/usr/bin/env python
# coding:utf-8


"""
发布订阅模式实现
"""


import message
from collections import defaultdict


route_table = defaultdict(list)


def sub(topic, callback):
"""

:param topic:
:param callback:
:return:
"""

if callback in route_table[topic]:
return

route_table[topic].append(callback)


def pub(topic, *args, **kwargs):
"""

:param topic:
:param args:
:param kwargs:
:return:
"""

for func in route_table[topic]:
func(*args, **kwargs)


def greeting(name):
"""

:param name:
:return:
"""

print 'Hello, {0}.'.format(name)


if __name__ == '__main__':

sub('greet', greeting)
pub('greet', 'LaiYonghao')

message.sub('greet', greeting)
message.pub('greet', 'Welcome to Python')

建议53:用状态模式美化代码

状态模式:当一个对象的内在状态改变时允许改变其行为,但这个对象看起来像是改变了其类。主要用于控制一个对象状态的条件表达式过于复杂的情况,其可把状态的判断逻辑转移到表示不同状态的一系列类中,进而把复杂的判断逻辑简化。
@stateful修饰函数,重载了被修饰类的getattr()方法从而使得类的实例方法能调用当前状态类的方法。被@stateful修饰后的类的实例是带有状态的,能够使用curr()查询当前状态,也可以使用switch()进行状态切换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/usr/bin/env python
# coding:utf-8


"""
状态模式实现
"""


from state import switch, stateful, State, behavior


@stateful
class People(object):
"""

"""

class Workday(State):
"""

"""

default = True

@behavior
def day(self):
print 'work hard.'

class Weekend(State):
"""

"""

@behavior
def day(self):
print 'play harder.'


def main():
"""

:return:
"""

people = People()
for i in xrange(1, 8):
if i == 6:
switch(people, People.Weekend)
if i == 1:
switch(people, People.Workday)
people.day()


if __name__ == '__main__':

main()
坚持原创技术分享,您的支持将鼓励我继续创作!