关于函数:python:为类的任何方法做些什么?

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()

我想为被调用的每个方法运行print("I am")。所以我应该得到

1
2
3
4
5
6
I am:
eating
I am:
sleeping
I am:
on the throne

有没有一种方法可以做到这一点而不必重新格式化每个方法?


如果无法更改方法的调用方式,则可以使用__getattribute__magic方法(方法是属性,请记住!)您只需仔细检查属性的类型,这样就不会在每次想要访问任何字符串或int属性时打印"i am:":

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


如果您不介意将__init____call__方法添加到类中,并将self添加到方法的参数中,那么可以这样做。

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")

编辑:查看我的其他答案以获得更好的解决方案


如果您还希望有参数,可以尝试使用元编程来更改类方法本身以运行前/后操作,比如如何在传递参数的所有类函数调用之前/之后运行方法的答案?


您可以编写另一个方法,如def iam(),在方法print"i am
"
中编写代码,并在每个方法之前调用。