【发布时间】:2013-01-19 08:02:51
【问题描述】:
我必须编写一个覆盖__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 中的每个键都是可访问的,object 基类的 __setattr__ 添加的每个属性都是可访问的,但 @property 装饰器的方法到属性不是。我认为这与我在Container 基类中覆盖__getattribute__ 的方式有关。我应该怎么做才能使来自@property 的属性可以访问?
【问题讨论】:
-
你真的需要使用
__getattribute__而不是__getattr__吗? -
@mgilson 我该如何处理
__getattr__? -
__getattr__仅在实例上找不到该属性时才被调用。
标签: python class attributes