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()
That funny @assignOrder(1)
line above def bar(self)
triggers this to happen:
Foo.bar = assignOrder(1)(Foo.bar)
assignOrder(1)
returns a function that takes another function, changes it (adding the field order
and setting it to 1
) and returns it. This function is then called on the function it decorates (its order
field gets thus set); the result replaces the original function.
It's a fancier, more readable and more maintainable way of saying:
def bar(self):
print "bar"
Foo.bar.order = 1
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…