【发布时间】:2018-08-27 10:28:53
【问题描述】:
我正在学习 Python 中的继承,并且正在试验超类和 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 而不是我预期的?据我了解,我正在实例化Engineer 类并将"Larry"、17 和120 传递给__init__,但随后我将"Bla bla"、10 和100 传递给超类的__init__,因此应该使用这些值初始化超类。然后当我调用my_engineer.describe() 时,它应该在超类中调用describe() 并使用超类的传入值。但显然,这不是正在发生的事情。谁能解释一下是怎么回事?
【问题讨论】:
-
你立即替换父
__init__设置的属性值,显式;为什么这令人惊讶? -
“我有 Java 背景,显然 super() 在 Python 中的工作方式与在 Java 中不同。” 你说得对。
super()在 Python 中的工作方式与在 Java 中不同。作为一个建议,最好不要试图将用一种语言学到的概念投射到你正在学习的另一种语言上。虽然语言确实具有某些广泛的共同点(在这种情况下为继承),但这些概念的实现方式通常非常不同。学习一门新语言时,最好将其视为一种独立的、独特的语言,而不是从所学的其他语言中引入其他思想。
标签: python python-3.x oop superclass