属性的访问控制
很多从其他语言转向Python的人都抱怨Python的类缺少真正意义上的封装(即没办法定义私有属性然后使用公有的getter和setter)。然而事实并非如此。实际上Python不是通过显式定义的字段和方法修改器,而是通过魔法方法实现了一系列的封装。
1. __getattr__(self, name)
当用户试图访问一个根本不存在(或者暂时不存在)的属性时,你可以通过这个魔法方法来定义类的行为。
这个可以用于捕捉错误的拼写并且给出指引,使用废弃属性时给出警告(如果你愿意,仍然可以计算并且返回该属性),以及灵活地处理AttributeError
。
只有当试图访问不存在的属性时它才会被调用,所以这不能算是一个真正的封装的办法。
2. __setattr__(self, name, value)
与__getattr__
不同, __setattr__
是真正的封装.
它允许你去定义对属性的赋值行为, 而不考虑这个属性是否存在. 也就是说, 你可以自定义规则去处理属性值的任何变化.
然而, 你必须小心如何使用__setattr__
.
3. __delattr__(self, name)
这个__delattr__
和__setattr__
完全一样, 只是前者是用来删除属性的行为.
和 __setattr__
一样,使用它时也需要多加小心,防止产生无限递归(在 __delattr__
的实现中调用 del self.name
会导致无限递归)。