繁体   English   中英

Python:如何记录所有类方法调用

[英]Python: How to log all class method calls

我正在尝试记录一个对象的所有方法调用。 通过覆盖__getattribute__ ,我可以拦截这些调用并打印它们。 我的实际对象有几十种方法。 为了简化,让我们看一个更简单的对象。 像这样的东西:

class Classy:
    def do_it(self):
        print('We did it!')

    def __getattribute__(self, attr):
        print(f'Calling {attr}')
        return Classy.__getattribute__(self, attr)


c = Classy()
c.do_it()

此代码抛出:

RecursionError: maximum recursion depth exceeded while calling a Python object

__getattribute__如何在绕过对自身的调用的同时查找子类中的方法?

编辑:有趣的是,对__init__()的调用绕过了__getattribute__ 相反,错误是由调用do_it()触发的。 这可能是一个线索。

EDIT2: 是一个相关的问题。 但是在研究了那里的答案之后,仍然不清楚(至少对我而言)调用父类的__getattribute__方法会反过来获取子类方法。

您需要调用父对象的__getattribute__方法,如果您没有定义Classy.__getattribute__就会调用该方法。

class Classy:
    def do_it(self):
        print('We did it!')

    def __getattribute__(self, attr):
        print(f'Calling {attr}')
        return super().__getattribute__(attr)

您需要访问底层object而不是您的类:

class Classy:
    def do_it(self):
        print('We did it!')

    def __getattribute__(self, attr):
        print(f'Calling {attr}')
        return object.__getattribute__(self, attr)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM