Python子类初始化器
在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