为什么我用减法魔法还能做加法?

问题描述 投票:0回答:2

这并不是什么大问题,而是一个真正的问题,来自于对 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 magic-methods
2个回答
0
投票

Python 不关心你在函数中做什么,这就是让你定义运算符的全部意义。第一次定义 __sub__ 时,它会在执行 x - y 时被调用,并且您决定在调用 __sub__ 时进行加法。第二次你仍然定义了 __sub__ 但没有定义 __add__,所以当你执行 x + y 时 python 无法调用 __add__


0
投票

我认为你看错了。

事实证明,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__
,当然 😁

© www.soinside.com 2019 - 2024. All rights reserved.