我不得不寫一些類別,覆蓋__getattribute__
。 基本上我的課是一個容器,它將每個用戶添加的屬性保存到self._meta
這是一本字典。蟒蛇__getattribute__覆蓋和@property裝飾
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
無法訪問。 (我得到了attributeerror。)._meta
中的每個鍵都是可訪問的,基類的__setattr__
的__setattr__
添加的每個屬性都是可訪問的,但通過@property裝飾器的方法對屬性不是。我認爲這與我在Container
基類中重寫__getattribute__
的方式有關。我應該怎樣做@property
的房產?
你真的需要* *使用'__getattribute__',而不是'__getattr__'? – mgilson
@mgilson我如何處理'__getattr__'? – thkang
只有在實例上未找到該屬性時纔會調用__getattr__'。 – Bakuriu