python - 运行时重载运算符

标签 python operator-overloading

是否可以在运行时重载运算符?我尝试了以下代码示例:

class A():
    pass
a = A()
a.__eq__ = lambda self, other: False
a == a # this should return False since the __eq__-method should be overloaded but it returns
       # True like object.__eq__ would
a.__eq__(a, a) # this returns False just as expected

为什么这段代码不起作用?是否有可能实现预期的行为?

最佳答案

魔术/双下划线方法是在类上查找的,而不是在实例上查找的。所以你需要重写类的方法,而不是实例。有两种方法可以做到这一点。

直接分配给类:

class A:
    pass

a = A()
A.__eq__ = lambda self, other: False
print(a == a)
print(a.__eq__(a)) # You're already passing in self by calling it as an instance method, so you only pass in the other one.

或者,如果您只有实例并且使用的是 3.x,则可以执行以下操作:

class A:
    pass

a = A()
type(a).__eq__ = lambda self, other: False
print(a == a)
print(a.__eq__(a))

关于python - 运行时重载运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39878667/

相关文章:

c++ - 为什么我可以为字符串重载 istream 的 operator>>?

c++ - 为类中定义的 typedef 定义 ostream operator<<

C++ 我的字符串类 : Pointer doesn't work

python - 将二进制数据插入pymongo中的Mongo字段

python - 在串行连接中将字符串转换为 int

python - 如何使用plotly使 map 适合宽度(python)

kotlin - Kotlin 协程中的 "+"?

c++ - 在 C++ 中重载 [][] 运算符

python - 如何使用 Keras 生成器选择batch_size、steps_per_epoch 和 epoch

python - 读取多个 CSV 文件,然后根据文件名重命名文件