内置“对象”的“Autolog”覆盖

时间:2016-09-26 08:07:12

标签: python logging built-in

我处理没有日志的遗留代码,我正在寻找记录所有方法调用的方法。

是否可以在python中覆盖内置的“对象”?

我尝试了以下代码:

class Foo(object):
    def __getattribute__(self,name):
        attr = super().__getattribute__(name)

        if hasattr(attr, '__call__'):
            def newfunc(*args, **kwargs):
                print('before calling %s' %attr.__name__)
                result = attr(*args, **kwargs)
                print('done calling %s' %attr.__name__)
                return result
            return newfunc
        else:
            return attr

object = Foo

class Bar():
    def myFunc(self, data):
        print("myFunc: %s"% data)


bar = Bar()
bar.myFunc(5)

但我的班级Bar不会继承“对象”。

输出:

myFunc: 5

但是,如果我像这样声明我的类Bar,它可以工作:

class Foo(object):
    def __getattribute__(self,name):
        attr = super().__getattribute__(name)

        if hasattr(attr, '__call__'):
            def newfunc(*args, **kwargs):
                print('before calling %s' %attr.__name__)
                result = attr(*args, **kwargs)
                print('done calling %s' %attr.__name__)
                return result
            return newfunc
        else:
            return attr

object = Foo

class Bar(object):
    def myFunc(self, data):
        print("myFunc: %s"% data)


bar = Bar()
bar.myFunc(5)

输出:

before calling myFunc
myFunc: 5
done calling myFunc

默认的“对象”无法覆盖?这里发生了什么?

也许你知道一个更好的解决方案?

感谢您的帮助:)

0 个答案:

没有答案