猿问

Python:记录类的所有方法而无需修饰每个方法

我想记录某些类中的每个方法调用。我本可以做的


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__,但是我也想记录静态方法调用,这给我带来了麻烦。


我搜索了这种类型的问题,但没有人尝试以此方式更改课程。


任何想法或帮助将不胜感激。


汪汪一只猫
浏览 265回答 3
3回答

MMMHUHU

为什么不更改类对象?您可以使用来遍历类中的方法,dir(MyClass)并用包装的版本替换它们...类似于:def logify(klass):    for member in dir(klass):        if not callable(getattr(klass, method))            continue # skip attributes        setattr(klass, method, log(method))像这样修补一下...应该可以...
随时随地看视频慕课网APP

相关分类

Python
我要回答