属性的访问控制

很多从其他语言转向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 会导致无限递归)。

Copyright © 李振超 2018 all right reserved,powered by Gitbook
该文件最后修订时间: 2018-02-25 07:12:09

results matching ""

    No results matching ""