我最近了解了python中的运算符重载,并且我想知道以下情况是否可能。
考虑以下假设/人为的类。
class My_Num(object):
def __init__(self, val):
self.val = val
def __add__(self, other_num):
if isinstance(other_num, My_Num):
return self.val + other_num.val
else:
return self.val + other_num
我知道上面写的方式,我可以做这样的事情
n1 = My_Num(1)
n2 = My_Num(2)
n3 = 3
print n1 + n2
print n1 + n3
这些将按预期工作。我也知道目前的书写方式我无法做到这一点
n1 = My_Num(1)
n2 = 2
print 2 + n1
有没有办法解决?我知道这个例子是人为设计的,但是我有一个应用程序,如果当我进行运算符重载时,为它定义运算符的类可以出现在运算符的右侧,它将非常有用。这可能在python中吗?
是。例如,有__radd__
。另外,没有用于__le__()
,__ge__()
等的对象,但是正如乔尔·科内特(Joel
Cornett)正确地观察到的那样,如果仅定义__lt__
,则a > b
调用的__lt__
功能b
,这提供了一种解决方法。
>>> class My_Num(object):
... def __init__(self, val):
... self.val = val
... def __radd__(self, other_num):
... if isinstance(other_num, My_Num):
... return self.val + other_num.val
... else:
... return self.val + other_num
...
>>> n1 = My_Num(1)
>>> n2 = 3
>>>
>>> print n2 + n1
4
>>> print n1 + n2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'My_Num' and 'int'
请注意,至少在某些情况下,这样做是合理的:
>>> class My_Num(object):
... def __init__(self, val):
... self.val = val
... def __add__(self, other_num):
... if isinstance(other_num, My_Num):
... return self.val + other_num.val
... else:
... return self.val + other_num
... __radd__ = __add__
问题内容: 是否可以在Python中重载运算符?如果是这样,可以定义新的运算符,例如和吗? 问题答案: 正如其他答案所提到的,您确实可以重载运算符(通过在正在编写的类中定义特殊方法,即名称以两个下划线开头和结尾的方法)。所有的细节都在这里。 要完成对您问题的回答:您不能定义新的运算符;但是它不是一个新的运算符,它是一个现有的运算符,并且通过在类中定义method来使其过载。 作为历史记录,这在C
Rust可以让我们对某些运算符进行重载,这其中大部分的重载都是对std::ops下的trait进行重载而实现的。 重载加法 我们现在来实现一个只支持加法的阉割版复数: use std::ops::Add; #[derive(Debug)] struct Complex { a: f64, b: f64, } impl Add for Complex { type Outpu
问题内容: 给定以下JavaScript“类”定义,这是我想到此问题的最佳方式: 以及以下测试设置代码: 有什么方法可以使用加法运算符隐式创建为对象,如下所示… 而不是求助于… 如果不是,那么在此领域中关于通过算术运算符使自定义数字JavaScript对象可组合的最佳实践建议是什么? 问题答案: 据我所知,JavaScript(至少现在已经存在)不支持运算符重载。 我能建议的最好的方法是使用一个类
问题内容: 请告诉我Java是否可以重载运算符?如果可以在Java中的任何地方使用它,请告诉我。 问题答案: 不,Java不支持用户定义的运算符重载。Java唯一接近“自定义”运算符重载的方面是对字符串+的处理,这将导致常量的编译时串联或使用StringBuilder / StringBuffer的执行时串联。但是,您无法定义自己的操作符,它们的操作方式相同。 对于确实支持运算符重载的类Java(
前面章节介绍了 Python 中的各个序列类型,每个类型都有其独特的操作方法,例如列表类型支持直接做加法操作实现添加元素的功能,字符串类型支持直接做加法实现字符串的拼接功能,也就是说,同样的运算符对于不同序列类型的意义是不一样的,这是怎么做到的呢? 其实在 Python 内部,每种序列类型都是 Python 的一个类,例如列表是 list 类,字典是 dict 类等,这些序列类的内部使用了一个叫作
问题内容: 什么是运营商吗?例如,以下操作做什么? 问题答案: 它是右移操作符,将所有位向右“移动”一次。 二进制10是 1010 移到右边变成 0101 这是5