对于python而言,我们知道可以使用@property这样的decorator来实现对于类的属性访问的控制。
但是这种方法存在一个限制,即,没有一个属性需要进行属性控制,就必须添加类似于如下的几行语句:
@property
Defwidth(self):
Returnself.__width
其实,我们还有一些内建的函数__getattr__(self,name)同样提供了对属性访问的限制。使用该函数,
我们就可以在一个函数中完成对多个属性的访问控制的设定, 如:
def__getattr__(self, name):
ifname == "colors":
returnset(self.__colors)
classname= self.__class__.__name__
ifname in fronzenset({"backtround", "width","height"}):
#此处构建的名字是考虑到私有成员变量的重命名(name mangling)
returnself.__dict__["_{classname}__{name}".format(
**locals())]
raiseAttributeError("'{classname}' object has no "
"attribute'{name}'".format(**locals()))