- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在学习 python 运算符重载(准确地说是 __radd__
和 __add__
),我有以下代码
class Commuter1:
def __init__(self, val):
self.val = val
def __add__(self, other):
print('add', self.val, other)
return self.val + other
def __radd__(self, other):
print('radd', self.val, other)
return other + self.val
x = Commuter1(88)
y = Commuter1(99)
print(x + y)
结果如下
当单独使用时,我理解 __radd__
和 __add__
是如何工作的。但是对于 x + y
行,我不确定为什么会同时调用 __radd__
和 __add__
方法。
最佳答案
首先,Python 查看x
和y
的类型来决定是调用x.__add__
还是y.__radd__
。由于它们都是同一类型 Commuter1
,因此它首先尝试 x.__add__
。
然后,在您的 __add__
方法中,您执行以下操作:
return self.val + other
因此,Python 查看 self.val
和 other
的类型来决定是调用 self.val.__add__
还是 其他.__radd__
。由于它们是不相关的类型 int
和 Commuter1
,它首先尝试 int.__add__
。
但是 int.__add__
为它不知道的类型返回 NotImplemented
,因此 Python 回退到调用 other.__radd__
。
在你的 __radd__
方法中,你这样做:
return other + self.val
因此,Python 查看other
和self.val
的类型来决定是调用other.__add__
还是self .val.__radd__
。因为它们都是相同类型的 int
,所以它首先尝试 __add__
。
当然 int.__add__
对另一个 int
有效,因此它返回 __radd__ 内部
,你返回,它返回 +
的值__add__
里面的 +
的值,你返回,它返回顶层 + 的值
,你打印的。
关于python 运算符重载 __radd__ 和 __add__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51298551/
我希望我的 Fraction 类在添加到 float 或整数时作为 float 工作,这样我就可以自然地用它执行操作,但它仅在 Fraction 时才起作用> 是最右边的操作数。有没有办法让它以任何顺
你好 试图理解 __radd__ 是如何工作的。我有代码 >>> class X(object): def __init__(self, x): self.x = x
我目前正在学习 python 运算符重载(准确地说是 __radd__ 和 __add__),我有以下代码 class Commuter1: def __init__(self, val):
我正在(作为练习)尝试制作一个使用罗马数字的类(class)。我试图将尽可能多的功能放入其中,所以我考虑让运算符(operator)在它们上工作。我发现(例如,问题在其他方法对中仍然存在)__add_
在 python 中,您可以覆盖右(和左)加法运算符 ( + ): 让我们将这个虚拟对象用于以下目的: class Dummy(object): pass ## dummy object 这是一
当使用 __radd__ 方法创建定义 noddy.Noddy 类型的 python (2.7.5) 扩展时,它会获得与(否则等效)python 不同的行为具有自定义 __radd__ 的已定义类对象
这个问题在这里已经有了答案: Custom class with __add__ to add with NumPy array (1 个回答) 关闭 9 个月前。 考虑以下 python 代码:
假设我们写一个小类: class K: pass obj = K() 是下面的代码... total = 4 + obj ...本质上和下面一样? import io try: tot
str 还有其他方法,如 __rmod__、__rsub__ 或 __rmul__ int 确实有一个 __radd__ 方法 很奇怪,我想知道为什么。 当第一个学期有 add 方法时调用的 radd
在Python中,如果我想要一个实例直接返回字段的字符串,我可以这样做: class X: def __init__(self, field): self.field = fi
我是一名优秀的程序员,十分优秀!