gpt4 book ai didi

Python __getattr__ 'NoneType' 对象不可调用

转载 作者:行者123 更新时间:2023-12-05 02:33:35 24 4
gpt4 key购买 nike

对于 Thing 类,当我调用一个未定义的方法时,例如 .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' 对象不可调用。为什么?

最佳答案

__getattr__ 返回属性。 __getattr__ 的实现返回 None - 所以当你说 t.doamethod 时,它的值是 None ,当您尝试使用 () 调用它时,您会收到 not callable 错误。

如果你想让你的属性成为一个可调用的空操作,你可以这样做:

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"

如果您希望该属性是一个可调用的,在被调用时(而不是在方法被访问时)打印“Run method”,那么将该代码放入 __getattr__ 的函数中 返回:

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

关于Python __getattr__ 'NoneType' 对象不可调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70934912/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com