Python的__getattr__和__setattr__方法,属性私有化

Python的__getattr__和__setattr__方法,属性私有化

__getattr__方法:

拦截点号运算。对象.属性:如果找不到属性,就会用属性名作为字符串,调用该方法;如果继承树可以找到该属性,则不会调用该方法

Python的__getattr__和__setattr__方法,属性私有化

这里empty类和实例x并没有属性age,所以执行x.age时,就会调用__getattr__方法,对于name也是同样。

 

__setattr__方法:
会拦截所有属性的的赋值语句。如果定义了这个方法,self.arrt = value 就会变成self.__setattr__("attr", value).

这个需要注意。当在__setattr__方法内对属性进行赋值是,不可使用self.attr = value,因为他会再次调用self.__setattr__("attr", value),则会形成无穷递归循环,最后导致堆栈溢出异常。应该通过对属性字典做索引运算来赋值任何实例属性,也就是使用self.__dict__['name'] = value.

实现属性的私有化
Python的__getattr__和__setattr__方法,属性私有化
上述方式是python实现属性私有化的首选方式。