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'})"
对于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'})"