python子类初始化器

时间:2010-08-12 23:39:13

标签: python initialization

在python OOP中,让我们说,Person是一个具有自己的初始化者的父类;那么学生是一个人的子类,在我使用学生之前,必须首先在学生的初始化者中调用Person.__init__(self)吗?另外,我可以在Student class中定义一个新的初始化器吗?

class Person():      
    def __init__(self):  

上面是具有初始化

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

我的意思是,学生可以拥有自己的初始化器吗?如果是这样,在这种情况下,必须在学生初始化程序中调用Person.__init__(self)吗?

6 个答案:

答案 0 :(得分:8)

当然,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

答案 1 :(得分: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

如果您在Student课程中没有Person.__init__,那么如果您希望能够像人一样使用它,那么您必须在Student类的Person类中执行所有操作。

答案 2 :(得分:1)

Student可以有自己的初始化程序。在python中,您可能会也可能不会调用基类初始化程序,但最好这样做。

答案 3 :(得分:0)

它不一定是,不是,但它确实应该。如果基类具有任何方法或属性,而这些方法或属性未在派生类中重写,则应调用基类中的初始化器,否则这些方法和属性可能无效。

编辑:让我澄清一下。您可以Student定义初始化程序,但该初始化程序确实应调用Person.__init__以确保基类已正确初始化。

答案 4 :(得分:0)

改编自Zimm3r的答案,但使用super获得最大正确性:

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):
        super(Student, self).__init__(name, age, heigth, weight)
        self.school = school

答案 5 :(得分:0)

您可以在__new__之前重载Python __init__,这是您在原始问题中查找的内容。

def __new__(cls, *args, **kwargs):pass