I have
class Foo():
function bar():
pass
function foobar():
pass
Rather than executing each function one by one as follows:
x = Foo()
x.bar()
x.foobar()
is there a built-in way to loop through and execute each function in the sequence in which they are written in the class?
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With