Python: Do something for any method of a class?
假设我有一个有很多方法的类:
1 2 3 4 5 6 7 8 9 10 | class Human(): def eat(): print("eating") def sleep(): print("sleeping") def throne(): print("on the throne") |
然后我用
1 2 3 4 | John=Human() John.eat() John.sleep() John.throne() |
我想为被调用的每个方法运行
1 2 3 4 5 6 | I am: eating I am: sleeping I am: on the throne |
有没有一种方法可以做到这一点而不必重新格式化每个方法?
如果无法更改方法的调用方式,则可以使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class Human(object): def __getattribute__(self, attr): method = object.__getattribute__(self, attr) if not method: raise Exception("Method %s not implemented" % attr) if callable(method): print"I am:" return method def eat(self): print"eating" def sleep(self): print"sleeping" def throne(self): print"on the throne" John = Human() John.eat() John.sleep() John.throne() |
输出:
1 2 3 4 5 6 | I am: eating I am: sleeping I am: on the throne |
如果您不介意将
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | class Human(): def __init__(self): return None def __call__(self, act): print"I am:" method = getattr(self, act) if not method: raise Exception("Method %s not implemented" % method_name) method() def eat(self): print"eating" def sleep(self): print"sleeping" def throne(self): print"on the throne" John = Human() John("eat") John("sleep") John("throne") |
编辑:查看我的其他答案以获得更好的解决方案
如果您还希望有参数,可以尝试使用元编程来更改类方法本身以运行前/后操作,比如如何在传递参数的所有类函数调用之前/之后运行方法的答案?
您可以编写另一个方法,如
"