- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在(作为练习)尝试制作一个使用罗马数字的类(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/
class C(object): def __init__(self, value): self.value = value def __add__(self, other):
当我尝试这个时: >>> "a".__add__("b") 'ab' 它正在工作。但是这个 >>> 1.__add__(2) SyntaxError: invalid syntax 不工作。这是有效的
如果 python 是一种支持重载的静态编程语言,那将很容易解决。我正在制作一个名为 Complex 的类,它是复数的表示(我知道 python 有它自己的,但我想自己制作一个),其中 a 是实数,b
在 python 3 中,我想在我创建的类中进行运算符重载。 我知道__add__代表运算符+。 -的方法是什么? , * , ^ , |和 & ? 最佳答案 参见 the python docs o
我想合并定义了 __add__ 方法的类的类实例列表。 即,我有一个类实例列表L=[A,B,C,D],我想要它们的总和E = A+B+C+D,但一般化后,我可以使用 E = sum(L) 代替 +
我一直在通过搜索教程来学习 Python 2。我正在发现关于类的事情。我在 __add__ dunder-method 中遇到了一些麻烦。我不知道如何添加 一个类的 2 个对象。 为了更清楚: cla
我希望实现如下内容。有一个类foo其中包含 infoo 的列表对象。我在想,为了重载 __add__运营商我应该 class foo(object): def __init__(self, i
我正在编写一个解析器,能够将字符串解析为方程。 当我遇到一个符号(例如 +)时,我需要生成一个接受两个输入并将它们相加的函数。 虽然我可以简单地编写一个 lambda 函数来做到这一点,但为这样的目的
我正在为我自己的解释器开发一个简单的类型系统。我正在写这样的东西: class Base(object): def __init__(self, content): self.
我正在阅读学习 Python 第 5 版,我需要对这一段进行更多解释: The __add__ method of strings, for example, is what really perfo
在 Python 中,我可以重载对象的 __add__ 方法(或其他双下划线又名“dunder”方法)。这允许我在使用 Python 运算符时为我的对象定义自定义行为。 是否有可能从 dunder 方
我需要编写一个涉及日期的类。我应该重载 +运算符允许将天数添加到日期中。解释它是如何工作的:A Date对象以 (year, month, date) 的格式表示为 (2016, 4, 15)。将整数
我目前正在学习 python 运算符重载(准确地说是 __radd__ 和 __add__),我有以下代码 class Commuter1: def __init__(self, val):
我正在(作为练习)尝试制作一个使用罗马数字的类(class)。我试图将尽可能多的功能放入其中,所以我考虑让运算符(operator)在它们上工作。我发现(例如,问题在其他方法对中仍然存在)__add_
我有一个类,其中包含一些数据。此类的两个对象的运算符 + 应该合并来自两个对象的数据并返回一个新对象。但是,如果在 += 运算符的情况下从添加的对象附加数据并返回 self 应该会好得多。这里有一些伪
class Matrix: def __init__(self, data): self.data = data def __repr__(self): return repr
我一直认为在 Python (3.5) 中使用“+”运算符会在后台调用 __add__ 方法并返回总和。但是,当涉及负数时,我注意到一些古怪的行为。当然, >>>-3 + 7 返回 4 但是(!) >
在 Python 中,add 和 __add__ 方法有什么区别? 最佳答案 名为 add 的方法就是那个 - 具有该名称的方法。它对语言或解释器没有任何特殊意义。关于它唯一可以说的是集合有一个同名的
当将整数值添加到浮点值时,我意识到如果在浮点上调用 __add__ 方法工作正常,例如: >>> n = 2.0 >>> m = 1 >>> n.__add__(m) 3.0 但如果对整数调用则不是:
我有一个矢量类: class Vector: def __init__(self, x, y): self.x, self.y = x, y def __str__(s
我是一名优秀的程序员,十分优秀!