超类中的调用方法没有给出我期望的输出?

Calling method in superclass not giving the output I expect?

我正在学习 Python 中的继承,并且正在试验 superclasses 和 super() 函数。这是我的代码:

class Person:
    def __init__(self, name, age, weight):
        self.name = name
        self.age = age
        self.weight = weight

    def describe(self):
        return f"{self.name}, {self.age}, {self.weight}"


class Engineer(Person):
    def __init__(self, name, age, weight):
        super().__init__("Bla bla", 10, 100)
        self.name = name
        self.age = age
        self.weight = weight
        self.occupation = "Engineer"

    def describe(self):
        return super().describe()

my_engineer = Engineer("Larry", 17, 120)
print(my_engineer.describe())

我有 Java 背景,显然 super() 在 Python 中的工作方式与在 Java 中的工作方式不同。在 Java 中,与此等效的代码输出为 Bla bla, 17, 120,但此代码输出的是 Larry, 17, 120。为什么此代码打印出 Larry, 17, 120 而不是我预期的结果?据我了解,我正在实例化 class Engineer 并将 "Larry"17120 传递给 __init__,但随后我传递在 "Bla bla"10100 到 superclass 的 __init__,所以 superclass 应该用这些值初始化。然后当我调用 my_engineer.describe() 时,它应该在 superclass 中调用 describe() 并使用 superclass 的传入值。但显然,这不是正在发生的事情。谁能解释一下这是怎么回事?

super 工作正常;但是,在 super 调用之后,您使用传递给子构造函数的值覆盖每个属性。相反,只需调用 super 并且不要使用相同的属性初始化子 class:

class Engineer(Person):
   def __init__(self, *args):
      super().__init__("Bla bla", 10, 100)
   def describe(self):
      return super().describe()

my_engineer = Engineer("Larry", 17, 120)
print(my_engineer.describe())

输出:

Bla bla, 10, 100

您看到属性被覆盖了。这些代码行中发生了什么:

super().__init__("Bla bla", 10, 100)
self.name = name
self.age = age
self.weight = weight
self.occupation = "Engineer"
  • super().__init__("Bla bla", 10, 100) 使用这些值调用 Person__init__,即 self = Person("Bla bla", 10, 100)。如果您停在这里,您将实例化 Person 的 subclass 而不会真正改变任何东西。 (相同的属性,相同的方法。)
  • 当您随后指定接下来的四个属性时,您将覆盖您在上一行中所做的操作。这些直接设置为 class 实例的属性。

本质上,这看起来 Python 类似于:

my_engineer = Person("Bla bla", 10, 100)
my_engineer.name = "Larry"
my_engineer.age = 17
my_engineer.weight = 120
my_engineer.occupation = "Engineer"

如@Ajax1234 所述,您似乎只想完全删除这四行。