gpt4 book ai didi

python - 为什么我不能用 __radd__ 替换 __add__?

转载 作者:行者123 更新时间:2023-12-04 03:05:56 26 4
gpt4 key购买 nike

我正在(作为练习)尝试制作一个使用罗马数字的类(class)。我试图将尽可能多的功能放入其中,所以我考虑让运算符(operator)在它们上工作。我发现(例如,问题在其他方法对中仍然存在)__add____radd__。文档说如果 __add__ 没有定义它(或者如果它失败了)查看 __radd__,但是当我尝试删除 __add__ 并编辑__radd__ 方法适用于 0 + myobject,但不适用于 object1 + object2

这是类(class)(删除了一些内容,因为它们对我的问题不重要):

class Roman:
num_map = [('M', 1000), ('CM', 900), ('D', 500), ('CD', 400), ('C', 100), ('XC', 90), ('L', 50), ('XL', 40), ('X', 10), ('IX', 9), ('V', 5), ('IV', 4), ('I', 1)]

def __init__(self, num=None):
self.decimal = 0
self.roman = 'N'
if type(num) == type(0):
self.__setattr__('decimal', num)
elif type(num) == type(''):
self.__setattr__('roman', num)


def __setattr__(self, field, value):
if field == 'decimal' and type(value) == type(0):
super().__setattr__('decimal', value)
super().__setattr__('roman', self.dec2roman(value))
elif field == 'roman' and type(value) == type(''):
super().__setattr__('roman', value)
super().__setattr__('decimal', self.roman2dec(value))

self.dec2roman(integer)self.roman2dec(string) 方法只是将一种格式转换为另一种格式。

现在,如果我尝试像这样制作 __radd__:

def __radd__(self, other):
if other == 0:
return self
return Roman(self.decimal + other.decimal)

它不起作用,但它确实有效:

def __add__(self,other):
return Roman(self.decimal + other.decimal)
def __radd__(self, other):
if other == 0:
return self
return self + other

这是我得到的错误:

>>> from roman import Roman
>>> a = Roman(3)
>>> b = Roman('X')
>>> a + b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'Roman' and 'Roman'

有人知道这是怎么回事吗?

最佳答案

根据 the “data model” section Python 文档,

[__radd__ and similar functions] are only called if the left operand does not support the corresponding operation and the operands are of different types.

(强调已添加。)这就是为什么定义 __radd__ 对您不起作用:您正在尝试添加 相同 类的两个项目。我不确定您为什么要避免使用 __add__,但在这种情况下显然需要使用该方法。

关于python - 为什么我不能用 __radd__ 替换 __add__?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44394577/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com