如何让每个类方法在执行前调用指定方法?

7 投票
1 回答
4154 浏览
提问于 2025-04-15 23:42

我想让我的Python类在调用任何方法时,先自动执行一个默认的方法,而不需要在每个方法里都明确写出来。举个例子可能会更清楚 :)

Class animals:
    def _internalMethod():
        self.respires = True

    def cat():
        self._internalMethod()
        self.name = 'cat'

    def dog():
        self._internalMethod()
        self.name = 'dog'

我希望当从动物这个实例调用任何方法时,_internalMethod()能自动被调用,而不是在每个方法的定义里都写上这个。有没有什么优雅的方法可以做到这一点?

谢谢!

1 个回答

5

你可以使用元类和getattribute来动态地给所有方法添加装饰器(如果你在用Python 2,记得要从object继承!)。

另外一个选择是直接在类上做一些修正,比如:

def add_method_call(func, method_name):
    def replacement(self, *args, **kw):
        getattr(self, method_name)()
        return func(self, *args, **kw)
    return replacement

def change_all_attrs(cls, added_method):
    for method_name in dir(cls):
        attr = getattr(cls, method_name)
        if callable(attr):
            setattr(cls, method_name, add_method_call(attr, added_method))

class animals(object):
    ...

change_all_attrs(animals, '_internalMethod')

这样做有点儿马虎,dir()不会获取父类中的任何方法,而且由于简单的callable(attr)测试,你可能会捕捉到一些你不想要的属性和其他对象。不过,这样做可能对你来说也没问题。

如果你使用的是Python 2.7及以上版本,你可以使用类装饰器,而不是在创建类后调用change_all_attrs,但效果是一样的(只不过你需要重写change_all_attrs使其成为一个装饰器)。

撰写回答