Python子类初始化器

4 投票
6 回答
19326 浏览
提问于 2025-04-16 02:43

在Python的面向对象编程中,假设有一个叫做Person的父类,它有自己的初始化方法;然后Student是Person的子类。在使用Student之前,是否必须先在Student的初始化方法中调用Person.__init__(self)呢?另外,我可以在Student类中定义一个新的初始化方法吗?

class Person():      
    def __init__(self):  

上面是Person类及其初始化方法

class Student(Person):    
    def __init__(self):  
        Person.__init__(self)   
    def __init__(self, age)

我的意思是,Student可以有自己的初始化方法吗?如果可以的话,在这种情况下,是否必须在Student的初始化方法中调用Person.__init__(self)呢?

6 个回答

1

其实不一定要这样,但最好是这样。如果父类有任何方法或属性没有在子类中被重新定义,那么就应该调用父类的初始化器,否则那些方法和属性可能会出现问题。

补充说明一下。你可以为 Student 定义一个初始化器,但这个初始化器最好要调用 Person.__init__,这样才能确保父类被正确初始化。

4

不,它应该是这样的:

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


class Student(Person):
    def __init__(self, name, age, height, weight, school):
        Person.__init__(self, name, age, heigth, weight)
        self.school = school

如果你在学生类里没有 Person.__init__,那么如果你想让学生类像人一样使用,你就得把人类里面的所有东西都重新写一遍放到学生类里。

9

当然,Student类可以有自己的初始化方法。不过在Python中,一个类只能有一个初始化方法,因为这个方法是在构造函数中调用的(也就是类的__new__方法)。

所以当我们说一个子类有自己的初始化方法时,其实我们是指这样的意思:

class Worker(People):
    def __init__(self, company):
        self.company = company

正如@IanH所指出的,你并不一定需要调用父类的初始化方法。当你觉得应该调用它(可能是为了某些共同的初始化操作)时,可以这样做:

class People:
    def __init__(self, name):
        self.name = name

class Student(People):
    def __init__(self, name, school):
        super(Student, self).__init__(name)
        self.school = school

撰写回答