をオーバーライドする何らかのクラスを作成する必要がありました__getattribute__
。基本的に私のクラスはコンテナであり、ユーザーが追加したすべてのプロパティをself._meta
辞書に保存します。
class Container(object):
def __init__(self, **kwargs):
super(Container, self).__setattr__('_meta', OrderedDict())
#self._meta = OrderedDict()
super(Container, self).__setattr__('_hasattr', lambda key : key in self._meta)
for attr, value in kwargs.iteritems():
self._meta[attr] = value
def __getattribute__(self, key):
try:
return super(Container, self).__getattribute__(key)
except:
if key in self._meta : return self._meta[key]
else:
raise AttributeError, key
def __setattr__(self, key, value):
self._meta[key] = value
#usage:
>>> a = Container()
>>> a
<__main__.Container object at 0x0000000002B2DA58>
>>> a.abc = 1 #set an attribute
>>> a._meta
OrderedDict([('abc', 1)]) #attribute is in ._meta dictionary
基本クラスを継承するいくつかのクラスがContainer
あり、それらのメソッドのいくつかには @property デコレータがあります。
class Response(Container):
@property
def rawtext(self):
if self._hasattr("value") and self.value is not None:
_raw = self.__repr__()
_raw += "|%s" %(self.value.encode("utf-8"))
return _raw
問題は、.rawtext
アクセスできないことです。(私は属性エラーを取得します。) のすべてのキーにアクセスでき、基本クラス._meta
によって追加されたすべての属性にアクセスできますが、@property デコレータによるメソッドからプロパティにはアクセスできません。基本クラスでオーバーライドする方法に関係していると思います。プロパティをアクセス可能にするにはどうすればよいですか?__setattr__
object
__getattribute__
Container
@property