我想记录某些类中的每个方法调用。我本可以做的
class Class1(object):
@log
def method1(self, *args):
...
@log
def method2(self, *args):
...
但是我在每个类中都有很多方法,并且我不想单独装饰每个方法。目前,我尝试对元类使用hack(覆盖已记录的类',__getattribute__以便如果我尝试获取一个方法,它将改为返回一个记录方法):
class LoggedMeta(type):
def __new__(cls, name, bases, attrs):
def __getattribute__(self, name_):
attr = super().__getattribute__(name_)
if isinstance(attr, (types.MethodType, types.FunctionType)) and not name_.startswith("__"):
return makeLogged(attr) #This returns a method that first logs the method call, and then calls the original method.
return attr
attrs["__getattribute__"] = __getattribute__
return type.__new__(cls, name, bases, attrs)
class Class1(object):
__metaclass__ = LoggedMeta
def method1(self, *args):
...
但是,我使用的是Python 2.X,并且super()语法不起作用。在我叫super的时候,我没有__getattribute__的类(但是我有它的类名),所以我不能使用旧的super语法super(Class, Inst)。
我之前尝试使用元类,但是覆盖了所有方法而不是__getattribute__,但是我也想记录静态方法调用,这给我带来了麻烦。
我搜索了这种类型的问题,但没有人尝试以此方式更改课程。
任何想法或帮助将不胜感激。
MMMHUHU
相关分类