这并不是什么大问题,而是一个真正的问题,来自于对 Python 幕后工作原理的无知。
我看到了一些关于魔术方法的知识,并决定尝试用它们编写一些代码来检查它们到底应该如何工作,并且通过我故意做错事情的试验和错误,我发现这段代码实际上可以工作:
class Vector:
def __init__(self):
self.n1 = 1
def __sub__(self, n):
return self.n1 + n
x = Vector()
print(x - 3)
事实是,代码返回给我值 4 - 这意味着它正在将两个数字相加,而不是告诉我它无法解决这个问题,因为我写了错误的符号,或者给了我一个负数作为结果
同时,如果我写这样的代码:
class Vector:
def __init__(self):
self.n1 = 1
def __sub__(self, n):
return self.n1 + n
x = Vector()
print(x + 3)
...它自动停止工作并说我做错了什么(好吧,显然,我正在尝试用减法进行加法!这不是应该工作!)
我想知道为什么 Python 会允许我的第一次失误。面纱后面发生了什么才能让它真正运行?
Python 不关心你在函数中做什么,这就是让你定义运算符的全部意义。第一次定义 __sub__ 时,它会在执行 x - y 时被调用,并且您决定在调用 __sub__ 时进行加法。第二次你仍然定义了 __sub__ 但没有定义 __add__,所以当你执行 x + y 时 python 无法调用 __add__
我认为你看错了。
事实证明,Python 的判断力并不强。您想在通常用于减法的方法中添加一些内容吗?就这样吧。想打印一些东西吗?好吧。想要抹掉你的电脑吗?由你决定...
class Vector:
def __sub__(self, n):
print(f"Hello {n}")
x = Vector()
x - "pepe"
将显示:
你好佩佩
当你编写 some_instance - blah
时,Python 要做的
唯一事情是调用
__sub__
的 dunder 方法 some_instance
(因为 -
),并以 some_instance
作为第一个参数 () self
)和 blah
作为第二个。该方法的作用取决于您。您想添加(就像您在示例中所做的那样)吗?当然可以为什么不呢?.
至于你的第二个问题:Python 不知道如何添加
Vector
的实例和整数 3
。不是因为你在减法上做加法。根本没有调用减法方法(__sub__
)。它存在或不存在并不重要。是因为你试图添加两个无法添加的东西。
...除非你的
Vector
类实现了 dunder 方法 __add__
,当然 😁