Python中的继承基础

2024-09-27 21:26:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解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中继承是如何工作的吗?你知道吗


Tags: 代码nameselfreturninitdefemployeefirstname
3条回答

Employee类从基Person类继承方法,包括__init__方法。因此在类定义的顶部,它有__init__Name方法。你知道吗

然后Employee类定义覆盖它继承的__init__方法。为了调用Person__init__方法,它必须按名称调用Person.__init__(实际上,它可以使用super()作为另一种选择)。你知道吗

但是由于Employee不会覆盖继承的Name方法,因此它可以使用self.Name()调用它在顶部继承的Name方法。你知道吗

以下两个方法是等效的(假设从未重写“Name”方法):

class Employee(Person):
    def __init__(self, first, last, staffnum):
        Person.__init__(self, first, last)
        self.staffnumber = staffnum

    def getEmployee(self):
        return Person.Name(self) + self.staffnumber


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

在第二个例子中,当自我。姓名()时,类的实例被“绑定”到函数,因此不需要传递第一个参数。你知道吗

因为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()调用。你知道吗

相关问题 更多 >

    热门问题