Python __getattr__ 'NoneType' 对象不可调用

Python __getattr__ 'NoneType' object is not callable

对于classThing,当我调用一个未定义的方法如.doamethod()...

class Thing:
    def __init__(self):
        pass
    def __getattr__(self, method):
        print('Run method: '+method)

t = Thing()
t.doamethod()

...我得到这个输出:

Run method: doamethod
Traceback (most recent call last):
  File "C:\Users\person\classtest.py", line 9, in <module>
    t.doamethod()
TypeError: 'NoneType' object is not callable

自从文本 Run method: doamethod 被打印后,我知道 __getattr__ 运行 的内容(这很好,我想要这个)但它也引发了 TypeError: 'NoneType' object is not callable。为什么?

__getattr__ returns 属性。 __getattr__ returns None 的实现——所以当你说 t.doamethod 时,它的值是 None,当你尝试用 (),你得到 not callable 错误。

如果您希望您的属性是可调用的 no-op,您可以这样做:

class Thing:
    # note: no need to add an empty __init__ method here
    def __getattr__(self, method):
        def impl(*args, **kwargs):
            return None
        print(f'Run method: {method}')
        return impl

t = Thing()
t.doamethod    # prints "Run method: doamethod"
t.doamethod()  # prints "Run method: doamethod"

如果您希望该属性是一个可调用的,在调用时打印“运行 方法”(而不是在 访问 方法时),然后将其放入__getattr__ returns:

函数中的代码
class Thing:
    def __getattr__(self, attr):
        def impl(*args, **kwargs):
            print(f'Run method: {attr}({args}, {kwargs})')
        print(f'Get attribute: {attr}')
        return impl

t = Thing()
func = t.foo          # prints "Get attribute: foo"
func()                # prints "Run method: foo((), {})"
func(42, arg2="bar")  # prints "Run method: foo((42,), {'arg2': 'bar'})"