分类目录:《系统学习Python》总目录
正如前面的文章所提到的,Python3.X中最直接的解决方案是:在像装饰器这样的基于委托的类中,重新定义可能在内嵌对象中出现的运算符重载名称。这种方法并不理想,因为它产生了一些代码冗余,特别是与Python2.X的解决方案相比较时。然而,这不是一项不能实现的编码工作;在某种程度上可以使用工具或父类来自动完成;它足以使我们的装饰器在Python3.X下工作;假设重载方法在内部触发了faillf测试,它也允许将运算符重载名称声明为Private
或Public
。
例如,下面的代码是一种内联重定义手段一一为被包装对象可能自己定义的每一个运算符重载方法的代理添加方法重定又,来捕获和委托。我们只增加了四个操作拦截器来说明其原理,但是其他的方法是类似的:
def accessControl(failIf):def onDecorator(aClass):class onInstance:def __init__(self, *args, **kwags):self.__wrapped = aClass(*args, **kwags)def __str__(self):return str(self.__wrapped)def __add__(self, other):return self.__wrapped + otherdef __getitem__(self, index):return self.__wrapped[index]def __call__(self, *args, **kargs):return self.__wrapped(*args, **kargs)def __getattr__(self, attr):trace('get:', attr)if failIf(attr):raise TypeError('Private attribute fetch:' + attr)else:return getattr(self.__wrapped, attr)def __setattr__(self, attr, value):trace('set:', attr, value)f attr == '_onInstance__wrapped':self.__dict__[attr] = valueelif failIf(attr):raise TypeError('Private attribute change:' + attr)else:setattr(self.__wrapped, attr, value)return onInstancereturn onDecorator
参考文献:
[1] Mark Lutz. Python学习手册[M]. 机械工业出版社, 2018.