[英]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.