我想记录某些类中的每个方法调用。我本可以做的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__,但是我也想记录静态方法调用,这给我带来了麻烦。我搜索了这种类型的问题,但没有人尝试以此方式更改课程。任何想法或帮助将不胜感激。
3 回答
MMMHUHU
TA贡献1834条经验 获得超8个赞
为什么不更改类对象?
您可以使用来遍历类中的方法,dir(MyClass)并用包装的版本替换它们...类似于:
def logify(klass):
for member in dir(klass):
if not callable(getattr(klass, method))
continue # skip attributes
setattr(klass, method, log(method))
像这样修补一下...应该可以...
添加回答
举报
0/150
提交
取消