我试图理解python中继承是如何工作的。我在看一个简单的代码,有件事让我困惑。代码如下:
class Person:
def __init__(self, first, last):
self.firstname = first
self.lastname = last
def Name(self):
return self.firstname + " " + self.lastname
class Employee(Person):
def __init__(self, first, last, staffnum):
Person.__init__(self,first, last)
self.staffnumber = staffnum
def GetEmployee(self):
return self.Name() + ", " + self.staffnumber
x = Person("Marge", "Simpson")
y = Employee("Homer", "Simpson","1007")
print(x.Name())
print(y.GetEmployee())
我的问题是,当我们使用Person.__init__()
调用基类的构造函数时,但是当我们再次调用基类的Name()方法时,我们使用的不是“Person”,而是“self”。有人能澄清这一困惑,让我理解python中继承是如何工作的吗?你知道吗
Employee
类从基Person
类继承方法,包括__init__
方法。因此在类定义的顶部,它有__init__
和Name
方法。你知道吗然后
Employee
类定义覆盖它继承的__init__
方法。为了调用Person
的__init__
方法,它必须按名称调用Person.__init__
(实际上,它可以使用super()
作为另一种选择)。你知道吗但是由于
Employee
不会覆盖继承的Name
方法,因此它可以使用self.Name()
调用它在顶部继承的Name
方法。你知道吗以下两个方法是等效的(假设从未重写“Name”方法):
在第二个例子中,当自我。姓名()时,类的实例被“绑定”到函数,因此不需要传递第一个参数。你知道吗
因为init在Employee子类中被重写,所以不能调用self.init(first,last)。然后,您将呼叫Employee.init(self,*args)而不是Person.init(self,*args)。这要么会创建一个无限递归循环,要么会得到一个参数错误。你知道吗
一般来说,重写方法时,必须在子类中使用以下表示法。ParentClass.methodname方法(self,*args,**kwargs)。你打电话的原因自我。姓名()是因为名称尚未被重写。你知道吗
我在这里重复我自己。这是结晶,还是我把你弄糊涂了?你知道吗
简单地说,
self.method()
意味着“调用可用的method
的最具体实现”(即,当前对象的继承树下最远的实现)。在本例中,您不需要调用self.__init__
,因为这样会再次调用Employee.__init__
。您需要编写Person.__init__
(或使用super()
)来显式调用继承的方法。你知道吗因为
Employee
没有定义自己的Name
方法,所以Person.Name
是可用的最具体的方法,所以self.Name()
就是这样称呼的。如果Employee
定义了自己的Name
,那么它将被self.Name()
调用。你知道吗相关问题 更多 >
编程相关推荐