def assignOrder(order):
@decorator
def do_assignment(to_func):
to_func.order = order
return to_func
return do_assignment
class Foo():
@assignOrder(1)
def bar(self):
print "bar"
@assignOrder(2)
def foo(self):
print "foo"
#don't decorate functions you don't want called
def __init__(self):
#don't call this one either!
self.egg = 2
x = Foo()
functions = sorted(
#get a list of fields that have the order set
[
getattr(x, field) for field in dir(x)
if hasattr(getattr(x, field), "order")
],
#sort them by their order
key = (lambda field: field.order)
)
for func in functions:
func()
在def bar(self)上方那条有趣的@assignOrder(1)线触发了这种情况:Foo.bar = assignOrder(1)(Foo.bar)
assignOrder(1)返回一个接受另一个函数的函数,更改它(添加字段order并将其设置为1)并返回它。然后对它修饰的函数调用这个函数(这样设置它的order字段);结果将替换原始函数。
这是一种更奇特、更可读、更易于维护的说法:def bar(self):
print "bar"
Foo.bar.order = 1