超类中的调用方法没有给出我期望的输出?
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"
、17
和 120
传递给 __init__
,但随后我传递在 "Bla bla"
、10
和 100
到 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 所述,您似乎只想完全删除这四行。
我正在学习 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"
、17
和 120
传递给 __init__
,但随后我传递在 "Bla bla"
、10
和 100
到 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 所述,您似乎只想完全删除这四行。