【问题标题】:I can't understand this example about Overload Operators我无法理解这个关于重载运算符的示例
【发布时间】:2020-05-17 19:45:14
【问题描述】:

我正在看一本书,这里有这个例子(关于 Python 中的重载运算符):

class MyClass:
   def __init__(self, *args):
      self.Input = args

   def __add__(self, Other):

      Output = MyClass()
      Output.Input = self.Input + Other.Input
      return Output

   def __str__(self):
      Output = ""
      for Item in self.Input:
         Output += Item
         Output += " "
      return Output

Value1 = MyClass("Red", "Green", "Blue")
Value2 = MyClass("Yellow", "Purple", "Cyan")
Value3 = Value1 + Value2

print("{0} + {1} = {2}"
      .format(Value1, Value2, Value3))

只是为了强调,这里是输出:

Red Green Blue  + Yellow Purple Cyan  = Red Green Blue Yellow Purple Cyan

所以,我知道这里会发生什么,但有一件事我无法理解。 Value 1 和 Value 2 对象给“*args”两个元组,然后,代码将“args”放入self.Input,就可以了。但是,从 add 方法开始,参数“Other”接收第二个元组(“Yellow”、“Purple”、“Cyan”),这个元组首先在 self.Input 变量上。为了证明这一点,您可以在构造函数中使用 print() 语句和 add 方法,并且您可以证明变量中的内容发生了变化。如果有任何 Python 程序员可以向我解释为什么会发生这种情况,我会很高兴。对不起,如果它不是那么容易理解,因为英语不是我的第一语言。

再次强调一下,例如:如果您在 init 方法中输入“print (self.Input)”,您将能够看到它包含两个元组 (RGB AND YPC),但是,如果你在 add 方法中输入“print (self.Input)”,它将只打印 RGB 元组,而 YPC 元组将位于“Other.Input” ,出于某种原因,我不知道,基本上,这是我的问题:为什么 self.Input 在构造函数方法中有两个元组,但是,在 'add' 方法中,它是不再了吗?

【问题讨论】:

  • Value1 仍然是 RGB,Value2 仍然是 YPC。哪个变量的内容发生了变化?
  • YPC 确实仍然分配给self.Input,但在Value2 对象内。添加对象Value1Value2 后,Python 的数据模型确保Value1__add__() 函数以Value2 作为(Other) 参数调用。这有意义吗?
  • 嗨,MarkM,我差点就明白了,但我还不清楚,很抱歉,你能详细解释一下吗?

标签: python oop operators overloading


【解决方案1】:

通过在代码中添加print,您可以查看在执行__add__ 时哪个实例是self,哪个是other

class MyClass:
    def __init__(self, *args: str):
        self.input = args

    def __add__(self, other: 'MyClass'):
        print(f"Adding {self} to {other}")
        return MyClass(*(self.input + other.input))

    def __str__(self) -> str:
        return " ".join(self.input)


value1 = MyClass("Red", "Green", "Blue")
value2 = MyClass("Yellow", "Purple", "Cyan")
value3 = value1 + value2

print(f"{value1} + {value2} = {value3}")

打印:

Adding Red Green Blue to Yellow Purple Cyan
Red Green Blue + Yellow Purple Cyan = Red Green Blue Yellow Purple Cyan

所以当您拨打value1 + value2 时,就像您拨打value1.__add__(value2) 一样。 other 参数是value2(包含Yellow Purple Cyan),selfvalue1(包含Red Green Blue)。

【讨论】:

  • 非常感谢朋友,我是初学者,所以我不熟悉这些东西,但是谢谢。
【解决方案2】:

不确定您的问题到底是什么,但这就是 __add__ 方法的工作原理。
每当您使用 + 运算符时,它都会从左侧操作数调用 __add__ 并且
正确的操作数将作为参数传入。

所以当Value1 + Value2被执行时,python:

  1. Value1 调用__add__ 方法并将Value1 分配给self
  2. Value2 被传入方法并被分配给Other 参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2023-04-09
    • 1970-01-01
    • 2015-10-02
    • 2014-12-14
    相关资源
    最近更新 更多