【问题标题】:Define method aliases in Python?在 Python 中定义方法别名?
【发布时间】:2012-07-01 04:05:15
【问题描述】:

我有一个向量类,我定义了__mul__ 方法来将向量乘以一个数字。

这是__mul__ 方法:

def __mul__(self, other):
    x = self.x * other
    y = self.y * other
    new = Vector()
    new.set_pos((x, y))
    return new

我的问题是我不知道数字和向量之间哪个是哪个。 如果 self 是数字,self.x 会引发错误。 (我可能在这一点上弄错了:“其他”总是一个数字吗?)

所以我在这里找到了:Python: multiplication override 我能做到的:

__rmul__ = __mul__

但是如何在类定义中做到这一点?

类似:

def __rmul__ = __mul__

【问题讨论】:

    标签: python class operator-overloading overriding operator-keyword


    【解决方案1】:

    只需将其列为属性:

    __rmul__ = __mul__
    

    这与在模块中创建函数别名的方式相同;在类体内创建方法的别名也是如此。

    【讨论】:

      【解决方案2】:

      重点是在 Python 中,您可以告诉对象如何将自己与事物相乘。这意味着

      a * b
      

      可以表示“告诉a 将自己乘以b”或“告诉b 将自己乘以a”。在代码中,这转化为

      a.__mul__(b)
      

      b.__rmul__(a)
      

      【讨论】:

      • 有没有办法知道哪个会被调用?
      • __mul__ 首先,如果失败则__rmul__
      • 更好:或“告诉 b 将 a 与自身相乘 (b)”。乘法运算符不必是可交换的。
      【解决方案3】:

      self 永远不会是 __mul__() 中的数字,因为方法所附加的对象不是数字,而是向量,根据定义,它是被乘数。

      other 将是一个数字,如果你的对象被一个数字相乘。或者它可能是其他东西,例如另一个向量,您可以对其进行测试和处理。

      当您的对象是乘数时,如果被乘数不知道如何处理运算,则会调用 __rmul__()

      要处理__mul____rmul__ 应该是相同方法的情况,因为操作是可交换的,您可以在类定义中进行赋值。

      class Vector(object):
          def __mul__(self, other):
              pass
      
          __rmul__ = __mul__
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-04
        • 1970-01-01
        • 1970-01-01
        • 2021-11-03
        • 2012-08-18
        • 2019-06-06
        • 1970-01-01
        相关资源
        最近更新 更多