使用修饰符来简化代码
常见的使用修饰符的场景是每个函数都有一段相同的逻辑,提取出来作为修饰符,那个比较常见,下面的例子是另外一个比较常见的使用修饰符的场景,可以提高代码可维护性。
有多种消息类型,每个类型对应一个消息类,新增消息类怎么添加到原先的代码逻辑呢,使用一堆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)