gpt4 book ai didi

python - 知道是否在对象上调用了 + 或 __add__

转载 作者:太空狗 更新时间:2023-10-29 21:36:36 27 4
gpt4 key购买 nike

在 Python 中,我可以重载对象的 __add__ 方法(或其他双下划线又名“dunder”方法)。这允许我在使用 Python 运算符时为我的对象定义自定义行为。

是否有可能从 dunder 方法中知道该方法是通过 + 还是通过 __add__ 调用的?

例如,假设我想创建一个打印 "+""__add__" 的对象,具体取决于是否使用了 + 或如果 __add__ 被直接调用。

class MyAdder(object):
def __add__(self, other):
print method_how_created()
return 0


MyAdder() + 7
# prints "+", returns 0

MyAdder().__add__(7)
# prints "__add__", returns 0

除非存在像 method_how_created 这样的魔法,是否存在符号到 dunder 方法的规范映射?我知道有列表,例如 http://www.python-course.eu/python3_magic_methods.php或基于解析 operator 模块的文档字符串的解决方案,如此处所述:Access operator functions by symbol .有没有一种方法可以找到函数名称和符号之间的映射,这种映射比解析文档字符串或手动创建列表更简单?

最佳答案

是的,但您可能不想这样做,因为这是个坏主意。您必须检查解释器堆栈。出于明显的原因,如果您的代码是从 C 调用的,这将不起作用。这是代码:

import inspect
import dis

class A(object):
def __add__(self, other):
fr = inspect.getouterframes(
inspect.currentframe(), 1)[1][0]
opcode = fr.f_code.co_code[fr.f_lasti]
# opcode = ord(opcode) # Uncomment for Python 2
is_op = opcode == dis.opmap['BINARY_ADD']
if is_op:
print('Called with +')
else:
print('Called with __add__')

A() + 1
A().__add__(1)

这已经在 Python 3 上测试和工作,并且只需要对 Python 2 稍作修改。

关于python - 知道是否在对象上调用了 + 或 __add__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36557885/

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