拥有20个以未知顺序调用的方法的类是否可以确定最后调用哪个方法?
我知道我可以在每个中添加一些print
并由我自己确定。
但是有一些内置插件吗?
类似dis
但显示方法名称
答案 0 :(得分:2)
一种简单的方法是覆盖__getattribute__
并检查所请求的属性是否是可调用的,如果是,则将其名称保存在某处:
class A(object):
def __init__(self):
self._last_called = None
def method1(self):
pass
def method2(self):
pass
def __getattribute__(self, attr):
val = object.__getattribute__(self, attr)
if callable(val):
self._last_called = attr
return val
<强>演示:强>
>>> a = A()
>>> a._last_called
>>> a.method1()
>>> a._last_called
'method1'
>>> a.method2()
>>> a._last_called
'method2'
如果您不想修改实际的类,可以创建一个装饰器,然后将其应用于任何类:
def save_last_called_method(cls):
original_getattribute = cls.__getattribute__
def new_getattribute(ins, attr):
val = original_getattribute(ins, attr)
if callable(val):
ins._last_called = attr
return val
cls.__getattribute__ = new_getattribute
return cls
@save_last_called_method
class A(object):
def method1(self):
pass
def method2(self):
pass
@save_last_called_method
class B(object):
def method3(self):
pass
a = A()
a.method1()
print a._last_called
a.method2()
print a._last_called
b = B()
b.method3()
print b._last_called
print a._last_called
<强>输出:强>
method1
method2
method3