virusdefender's blog ʕ•ᴥ•ʔ

使用修饰符来简化代码

常见的使用修饰符的场景是每个函数都有一段相同的逻辑,提取出来作为修饰符,那个比较常见,下面的例子是另外一个比较常见的使用修饰符的场景,可以提高代码可维护性。

有多种消息类型,每个类型对应一个消息类,新增消息类怎么添加到原先的代码逻辑呢,使用一堆if么

1    message_type = message["type"]
2    if message_type == "text":
3        TextMessage(message).handle()
4    elif message_type == "voice":
5        VoiceMessage(message).handle()
6    else:
7        UnknownMessage(message).handle()

这样肯定可以,但是降低了代码可维护性,每次都要修改,太麻烦了。

这里我们可以使用修饰符了~

 1# coding=utf-8
 2MESSAGE_CLASSES = {}
 3
 4
 5def handle_for_message_types(message_type):
 6    def register(cls):
 7        MESSAGE_CLASSES[message_type] = cls
 8        return cls
 9
10    return register
11
12
13class BaseMessage(object):
14    def __init__(self, message):
15        self.message = message
16
17
18@handle_for_message_types("text")
19class TextMessage(BaseMessage):
20    def handle(self):
21        print "text messsage"
22
23
24@handle_for_message_types("voice")
25class VoiceMessage(BaseMessage):
26    def handle(self):
27        print "voice message"
28
29
30@handle_for_message_types("unknown")
31class UnknownMessage(BaseMessage):
32    def handle(self):
33        print "unknown message"
34
35
36def parse_message(message):
37    cls = MESSAGE_CLASSES.get(message["type"], UnknownMessage)
38    cls(message).handle()
39
40
41parse_message({"type": "text", "content": "Hello world"})
42parse_message({"type": "voice", "content": "http://xxx.com/voice.mp3", "length": 10})
43parse_message({"type": "new_type", "content": "balabala"})

每次只增加代码就可以了,不用修改老代码~

里面的类修饰符相当于

1@addID
2class Foo:
3    pass
4
5class Foo:
6    pass
7
8Foo = addID(Foo)

提交评论 | 微信打赏 | 转载必须注明原文链接

#Python