「理由」属性を追加することを除いて、値を取り、それと同じように動作するラッパー クラスを作成したいと考えています。私は次のようなことを念頭に置いていました:
class ExplainedValue(object):
def __init__(self, value, reason):
self.value = value
self.reason = reason
def __getattribute__(self, name):
print '__getattribute__ with %s called' % (name,)
if name in ('__str__', '__repr__', 'reason', 'value'):
return object.__getattribute__(self, name)
value = object.__getattribute__(self, 'value')
return object.__getattribute__(value, name)
def __str__(self):
return "ExplainedValue(%s, %s)" % (
str(self.value),
self.reason)
__repr__ = __str__
__getattribute__
ただし、二重アンダースコア関数は、たとえば次のようにキャプチャされていないようです。
>>> numbers = ExplainedValue([1, 2, 3, 4], "it worked")
>>> numbers[0]
Traceback (most recent call last):
File "<pyshell#118>", line 1, in <module>
numbers[0]
TypeError: 'ExplainedValue' object does not support indexing
>>> list(numbers)
__getattribute__ with __class__ called
Traceback (most recent call last):
File "<pyshell#119>", line 1, in <module>
list(numbers)
TypeError: 'ExplainedValue' object is not iterable
上記の2つは最終的にこれを行うべきだと思います:
>>> numbers.value[0]
__getattribute__ with value called
1
>>> list(numbers.value)
__getattribute__ with value called
[1, 2, 3, 4]
なぜこれが起こらないのですか?どうすれば実現できますか?(これを実際のコードで実際に使用するのは恐ろしい考えかもしれませんが、今は技術的な問題に興味があります。)