gpt4 book ai didi

python - 如何使用 __getattr__ 函数处理和返回 Python 类中缺少的属性和函数?

转载 作者:太空宇宙 更新时间:2023-11-04 01:29:53 26 4
gpt4 key购买 nike

在 Python 类上使用 __getattr__ 特殊方法来处理缺失的属性或函数是相当容易的,但似乎不能同时进行。

考虑这个例子,它处理类中其他地方没有明确定义的任何请求的属性......

class Props:
def __getattr__(self, attr):
return 'some_new_value'

>>> p = Props()
>>> p.prop # Property get handled
'some_new_value'

>>> p.func('an_arg', kw='keyword') # Function call NOT handled
Traceback (most recent call last):
File "<console>", line 1, in <module>
TypeError: 'str' object is not callable

接下来,考虑这个示例,它处理类中其他地方未明确定义的任何函数调用...

class Funcs:
def __getattr__(self, attr):
def fn(*args, **kwargs):
# Do something with the function name and any passed arguments or keywords
print attr
print args
print kwargs
return
return fn

>>> f = Funcs()
>>> f.prop # Property get NOT handled
<function fn at 0x10df23b90>

>>> f.func('an_arg', kw='keyword') # Function call handled
func
('an_arg',)
{'kw': 'keyword'}

问题是如何在同一 __getattr__ 中处理两种类型的缺失属性?如何检测请求的属性是属性表示法还是带括号的方法表示法并分别返回值或函数?本质上,我想处理一些缺失的属性属性和一些缺失的函数属性,然后对所有其他情况求助于默认行为。

建议?

最佳答案

How to detect if the attribute requested was in property notation or in method notation with parentheses and return either a value or a function respectively?

你不能。您也无法判断请求的方法是实例、类还是静态方法等。您只能判断有人正在尝试检索属性以进行读取访问。没有任何其他内容被传递到 getattribute 机制中,因此您的代码无法使用任何其他内容。

因此,您需要某种带外方式来了解是创建函数还是创建其他类型的值。这实际上很常见——您实际上可能正在代理一些其他确实具有值/函数区别的对象(想想ctypes 或 PyObjC),或者您可能有一个命名约定等

但是,您始终可以返回一个可以任意方式使用的对象。例如,如果您的“默认行为”是返回属性是整数,或返回整数的函数,您可以返回如下内容:

class Integerizer(object):
def __init__(self, value):
self.value = value
def __int__(self):
return self.value
def __call__(self, *args, **kw):
return self.value

关于python - 如何使用 __getattr__ 函数处理和返回 Python 类中缺少的属性和函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14612442/

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