分类目录:《系统学习Python》总目录
通常接口代理被要求添加对运算符重载方法的支持,以便正确地委托调用。然而,在我们特定的私有应用中,它也引起了一些额外的设计选择。特别地,运算符重载方法的私有性依每个实现而有不同:
- 它们调用
__getattr__
,重定位混合类要求仝部访问的__X__
名称在Public
装饰中列出,或者当运算符重载在客户端中出现时使用Private
替代。在大量使用重载的类中,Public
可能是不切实际的。 - 它们完全地绕过
__getattr__
,就像这里编写的内联方案和self._wapped
混合类,这二者没有这些限制,但是它们阻碍内置操作成为私有,并且造成内置操作分发在按名称的显式__X__
调用和Python2.X的默认经典类中不对称地工作。 - Python2.X的经典类拥有这里第一项的限制,仅仅因为全部的
__X__
名称都自动导向__getattr__
。 - 运算符重载名称和协议在python2.X和3.X之间是不同的,使得真正的跨版本装饰不再简单易用(例如,
Public
装饰器可能需要为这两个系列分别列出名称)。
这里的最后策略待定,但是一些接口代理倾向于允许__X__
运算符名称在委托时总是可以未经检查地通过。
然而在通常的情形下,为容纳Python3.X的新式类作为委托代理,需要有充分大量的额外代码一一原则上讲,每一个不再作为普通实例属性自动分发的运算符重载方法,都将需要在通用工具类中繁冗地定义,就像这个私有装饰器一样。这就是为什么我们的代码中省略了这一扩展:潜在地有50多种这样的方法!因为其全部类都是新式的,所以基于委托的代码在Python3.X中会更加有难度,尽管不是必然不可实现。
参考文献:
[1] Mark Lutz. Python学习手册[M]. 机械工业出版社, 2018.