使用__getattribute__来获取方法名称,而不会出现类型错误

时间:2019-10-02 19:56:48

标签: python-3.x

我正在尝试使用__getattribute__

打印方法的名称

但是每次调用该方法时都会遇到typeerror,并且该方法没有被执行,是否有摆脱类型错误并执行该方法的方法?

class Person(object):
    def __init__(self):
        super()

    def test(self):
        print(1)

    def __getattribute__(self, attr):
        print(attr)



p = Person()

p.test()

上面的代码给出了错误

test
Traceback (most recent call last):
  File "test1.py", line 15, in <module>
    p.test()
TypeError: 'NoneType' object is not callable

反正有没有只打印方法名称而不给出错误?

我试图在__getattribute__方法中捕获typeError,但是它不起作用

另一个问题是,为什么在这里说None Type object is not callable

谢谢!

Ps。我知道我在调用该方法时可以捕捉到该错误,这意味着在__getattribute方法内是否有任何错误可以解决?因为我的目标是每次调用方法

时都打印方法的名称

1 个答案:

答案 0 :(得分:1)

首先回答您的第二个问题,为什么说NoneType不可调用。

调用p.test()时,Python会尝试查找test实例的p属性。它会调用您已重写的__getattribute__方法,该方法将显示“ test”,然后返回。因为您没有返回任何内容,所以它隐式返回None。因此,p.testNone,调用它会得到错误消息。

那么我们该如何解决呢?打印属性名称后,您需要返回要使用的属性。您不能只调用getattr(self, attr),否则最终将陷入无限循环,因此您必须调用未覆盖的方法。

def __getattribute__(self, attr):
    print(attr)
    return super().__getattribute__(attr) # calls the original method