【问题标题】:Is it a good idea to delegate addition to in-place addition for custom classes?将添加委托给自定义类的就地添加是一个好主意吗?
【发布时间】: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


    【解决方案1】:

    这当然是在 C++ 中非常自然和推荐的做事方式。

    另一方面,如果您有不可变对象(如基本整数或字符串类型),您将没有__iadd__,而必须直接实现__add__

    如果您没有__iadd__,则从the docsx += y 将调用x.__add__(y)y.__radd__(x),然后将结果分配给x。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-13
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-28
      相关资源
      最近更新 更多