属性参照、およびメモリ節約の為の__slots__属性については例によりEffectivePythonが分かりやすくまとまっている。
Python Document (2.5) でも、Language Referenceに "3.4.2 Customizing attribute access" として説明がある。
t_specialattrs_attr.py :
class C(object):
def __getattr__(self, name):
print "__getattr__(self, " + name + ")"
if name in self.__dict__:
#return self.__dict__[name] # 新形式でない場合はこちら。
return object.__getattr__(self, name) # 新形式ならこっち。
else:
print 'no key:', name
return None
def __setattr__(self, name, value):
print "__setattr__(self, " + name + ", " + repr(value) + ")"
#self.__dict__[name] = value # 新形式でない場合はこちら。
object.__setattr__(self, name, value) # 新形式ならこっち。
def __delattr__(self, name):
print "__delattr__(self, " + name + ")"
#del self.__dict__[name] # 新形式でない場合はこちら。
object.__delattr__(self, name) # 新形式ならこっち。
c = C()
c.v1 = 'abc'
print c.v1
print c.v2
print repr(c.__dict__)
del c.v1
print repr(c.__dict__)
> python t_specialattrs_attr.py
__setattr__(self, v1, 'abc') ... c.v1 = 'abc'
abc ... print c.v1
__getattr__(self, v2) ... print c.v2
no key: v2
None
{'v1': 'abc'} ... print repr(c.__dict__)
__delattr__(self, v1) ... del c.v1
{} ... print repr(c.__dict__)