为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

汪汪一只猫 2021-03-04 22:29:37
我想记录某些类中的每个方法调用。我本可以做的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))

像这样修补一下...应该可以...


查看完整回答
反对 回复 2021-03-30
  • 3 回答
  • 0 关注
  • 264 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信