- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
假设我们写一个小类:
class K:
pass
obj = K()
是下面的代码...
total = 4 + obj
...本质上和下面一样?
import io
try:
total = 4.__add__(obj)
except NotImplementedError:
try:
total = obj.__radd__(4)
except AttributeError:
# type(obj) does not have an `__radd__` method
with io.StringIO() as string_stream:
print(
"unsupported operand type(s) for +:",
repr(type(4).__name__),
"and",
repr(type(obj).__name__),
file=string_stream
) # `repr` puts quotes around the type names
msg = string_stream.getvalue()
raise TypeError(msg) from None
最佳答案
触发 __radd__()
的行为实际上不是 NotImplementedError
,而是一个名为 NotImplemented
的特殊对象:
>>> help(NotImplemented)
Help on NotImplementedType object:
class NotImplementedType(object)
| Methods defined here:
|
| __reduce__(...)
| Helper for pickle.
|
| __repr__(self, /)
| Return repr(self).
|
| ----------------------------------------------------------------------
| Static methods defined here:
|
| __new__(*args, **kwargs) from builtins.type
| Create and return a new object. See help(type) for accurate signature.
NotImplementedError
仍将作为错误传播。但是,返回 NotImplemented
对象(而不是引发错误)将允许 __radd__()
触发:
>>> class A:
... def __add__(self, other):
... raise NotImplementedError()
...
>>> class B:
... def __add__(self, other):
... print("__add__ was called")
... def __radd__(self, other):
... print("__radd__ was called")
...
>>> class C:
... def __add__(self, other):
... return NotImplemented
...
>>> a, b, c = A(), B(), C()
>>> b + a
__add__ was called
>>> a + b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in __add__
NotImplementedError
>>> b + c
__add__ was called
>>> c + b
__radd__ was called
关于python - 如果 `__radd__` 引发 `__add__`,是否调用 `NotImplementedError`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58828522/
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
我是一名优秀的程序员,十分优秀!