在python OOP中,让我们说,Person是一个具有自己的初始化者的父类;那么学生是一个人的子类,在我使用学生之前,必须首先在学生的初始化者中调用Person.__init__(self)
吗?另外,我可以在Student class中定义一个新的初始化器吗?
class Person():
def __init__(self):
上面是具有初始化
的类Personclass Student(Person):
def __init__(self):
Person.__init__(self)
def __init__(self, age)
我的意思是,学生可以拥有自己的初始化器吗?如果是这样,在这种情况下,必须在学生初始化程序中调用Person.__init__(self)
吗?
答案 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