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__
かです。要求された属性がプロパティ表記であるか、括弧付きのメソッド表記であるかを検出し、それぞれ値または関数を返す方法は?基本的に、いくつかの欠落しているプロパティ属性といくつかの欠落している関数属性を処理してから、他のすべての場合はデフォルトの動作に頼りたいと思います。
助言?