【问题标题】:Implementing operators in python [duplicate]在python中实现运算符[重复]
【发布时间】:2014-03-03 10:05:24
【问题描述】:

是否可以在 Python 中实现运算符?像类似于 +,- ... 等的二元运算符。例如,我从 R 中知道每个运算符实际上都是一个函数,所以 + 是 sum(x,y) 或类似的东西。我想知道这是否也可以实现,例如我可以将二元运算符定义为:*.然后用它做点什么,比如用它来代替Numpy中的dot()进行矩阵乘法。我不确定装饰器是否可用于在 python 中执行此操作。

【问题讨论】:

  • 既然 Numpy 做到了,它必须是可能的,你不同意吗?
  • @KonradRudolph Numpy 不这样做!
  • 完全可以:numpy.matrix([[1, 2], [3, 4]]) * numpy.matrix([[5, 6], [7, 8]]) 执行矩阵乘法。

标签: python numpy operators


【解决方案1】:

可用于实现运算符的特殊方法列表可以在这里找到:http://docs.python.org/2/reference/datamodel.html

例如,要实现 += 加法运算符,您可以这样做:

class Adder(object):
    def __init__(self, x):
        self.x = x

    def __iadd__(self, other):
        self.x += other.x
        return self

if __name__ == '__main__':

    a1 = Adder(0)
    a2 = Adder(1)
    a1 += a2
    print a1.x

【讨论】:

    【解决方案2】:

    Python 中的运算符通过special methods 重载,例如__add____mul__ 等。这样您只能定义现有运算符的行为(+*)。与 Scala 或 Haskell 不同,您不能声明 new 运算符文字,例如 *.。也不能为之前定义的类重载运算符(因为实现必须是方法)。

    【讨论】:

    • 您可以为现有类型重载运算符,只要其中一个操作数属于您定义的类型。但是,您不能重载 list+int 或重新定义 tuple+tuple。
    猜你喜欢
    • 2020-03-31
    • 2013-11-22
    • 1970-01-01
    • 2013-10-16
    • 2017-03-20
    • 2010-12-28
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    相关资源
    最近更新 更多