【发布时间】:2014-12-10 11:11:59
【问题描述】:
我学习 Python 已经有一段时间了,我开始明白正确覆盖 __setattr__ 可能会很麻烦(to say the least!)。
有哪些有效方法可以确保/向自己证明覆盖已正确完成?我特别关心确保覆盖与描述符协议和 MRO 保持一致。
(标记为 Python 3.x,因为这是我正在使用的,但这个问题当然也适用于其他版本。)
“覆盖”显示默认行为的示例代码(但我如何证明呢?):
class MyClass():
def __setattr__(self,att,val):
print("I am exhibiting default behavior!")
super().__setattr__(att,val)
覆盖违反描述符协议的人为示例(实例存储查找发生在描述符查找之前 - 但我如何测试它?):
class MyClass():
def __init__(self,mydict):
self.__dict__['mydict'] = mydict
@property
def mydict(self):
return self._mydict
def __setattr__(self,att,val):
if att in self.mydict:
self.mydict[att] = val
else:
super().__setattr__(att, val)
理想的答案将提供一个通用测试,当__setattr__ 被正确覆盖时将成功,否则失败。
【问题讨论】:
-
你目前在测试什么?
-
没什么特别的。这是一个普遍的问题。我正在考虑如何做到这一点并且想不出任何方法来做到这一点(例如为属性设置顺序的每个步骤获取日志或打印语句以显示它们完成的顺序 - 不知道如何要做到这一点)。但我也很缺乏经验。
-
@RickTeachey:对不起,我看错了。问题是原始覆盖的
__setattr__版本没有被调用。由于从未调用过object.__setattr__,因此也永远不会调用带有 setter 的描述符。 -
答案都是很好的解决方案,很难在它们之间做出选择。最后我选择了 Bruno's,因为它更具体地解决了这个特殊问题。
标签: python python-3.x unit-testing setattr