【发布时间】:2017-10-03 09:28:35
【问题描述】:
给定一个需要支持加法的自定义类,是否有任何理由不将__add__ 方法委托给__iadd__,这样:
def __add__(self, other):
if not self.comparable(other):
raise ValueError("Objects cannot be added!")
temp = copy.deepcopy(self)
temp += other
return temp
def __iadd__(self, other):
if not self.comparable(other):
raise ValueError("Objects cannot be added!")
self.x += other.x
self.y += other.y
# ... whatever else addition voodoo
除了copy.deepcopy 可能是内存问题之外,我无法提出任何建议,但由于添加应该返回一个新对象并保持self 不变,我不确定这是可以避免的。另一种方法是使用构造函数实例化一个新对象,如果类有许多可变变量,这并不是一个很好的选择。在我的例子中,它是一个随机模型,由整块训练数据生成,因此更容易获得副本。
以上所有定义都符合要求,但我在任何教程中都没有看到这两种方法之间存在这种类型的依赖关系,这让我有点怀疑。
这有什么危险或不好的做法吗?
【问题讨论】:
标签: python oop operator-overloading