<p>如果您使用的是python3.6,那么这种情况可以利用新的<code>__init_subclass__</code>方法。当子类被创建时,它被子类调用。在</p>
<p>如果没有Python3.6,您必须使用元类。在</p>
<p>decorator本身可以用所需的数据标记每个方法。在</p>
<pre><code>def on_initialize(precedence=0):
def marker(func):
func._initializer = precedence
return func
return marker
def on_event(precedence=0):
def marker(func):
func._event_handler = precedence
return func
return marker
def on_finalize(precedence=0):
def marker(func):
func._finalizer = precedence
return func
return marker
class Framework:
def __init_subclass__(cls, *args, **kw):
super().__init_subclass__(*args, **kw)
handlers = dict(_initializer=[], _event_handler=[], _finalizer=[])
for name, method in cls.__dict__.items():
for handler_type in handlers:
if hasattr(method, handler_type):
handlers[handler_type].append((getattr(method, handler_type), name))
for handler_type in handlers:
setattr(cls, handler_type,
[handler[1] for handler in sorted(handlers[handler_type])])
def initialize(self):
for method_name in self._initializer:
getattr(self, method_name)()
def handle_event(self, event):
for method_name in self._event_handler:
getattr(self, method_name)(event)
def finalize(self):
for method_name in self._finalizer:
getattr(self, method_name)()
def run(self):
self.initialize()
for event in range(10):
self.handle_event(event)
self.finalize()
</code></pre>
<p>如果您有一个复杂的类层次结构,应该正确地继承操作方法,那么在将其作为类属性应用之前,您必须将<code>handlers</code>字典中的列表与超类中的列表合并(将超类作为<code>cls.__mro__[1]</code>)应用。在</p>
<p>另外,如果使用的是Python<;3.6,则需要将<code>__init_subclass__</code>上的逻辑移到元类中。只需将代码放在元类的<code>__init__</code>方法上(并适当地调整传入参数和超级调用),它的工作原理应该是一样的。在</p>