在 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__
?如何检测请求的属性是属性表示法还是带括号的方法表示法并分别返回值或函数?本质上,我想处理一些缺失的属性属性和一些缺失的函数属性,然后在所有其他情况下采用默认行为。
建议?