如何从父类继承__init__属性到子类的__init__?

时间:2019-10-14 13:50:16

标签: python

我正在尝试从父类继承属性:

class Human:
def __init__(self,name,date_of_birth,gender,nationality):
    self.name = name
    self.date_of_birth = date_of_birth
    self.gender = gender
    self.nationality = nationality

给孩子班的学生:

class Student(Human):
def __init__(self,university,std_id,first_year_of_registration,study_program):
    super(Student,self).__init__(name,date_of_birth,gender,nationality)
    self.university = university
    self.std_id = std_id
    self.first_year_of_registration = first_year_of_registration
    self.study_program = study_program


def select(c):
    pass
def drop(c):
    pass

def __str__(self):
    return 'Student ID {self.std_id},and student name is {self.name} and his study program is {self.study_program}'.format(self=self)

因此,我可以使用两个(父,学生)属性(例如So)来创建对象:

s = Student('mark','2000-1-1','M','country','school',2017159,2017,'SE')

那么我可以:

print(s)

并像这样调用__str__函数:

Student ID 2017159,and student name is mark and his study program is SE

但是每当我创建对象时,它都会给我错误:

Traceback (most recent call last):
Python Shell, prompt 7, line 1
builtins.TypeError: __init__() takes 5 positional arguments but 9 were 
given

我是python的新手。因此,我在互联网上搜索并尝试做一些继承示例,例如:

Human.__init__()

但是没有任何效果,我也在这里检查了很多答案,但是没有一个解决了我的问题。 希望任何人都可以提供帮助,并指出这里出了什么问题。

1 个答案:

答案 0 :(得分:3)

def __init__(self,university,std_id,first_year_of_registration,study_program)

但是

Student('mark','2000-1-1','M','country','school',2017159,2017,'SE')

好吧,你知道,Python不是读书的人。您需要告诉它您想要什么。

现在,Python只需要全部university,std_id,first_year_of_registration,study_program,仅此而已。

这意味着,您需要告诉它以获取其他元素:

class Student(Human):
    def __init__(self,name,date_of_birth,gender,nationality, university,std_id,first_year_of_registration,study_program):
        ...

或说“并获得一些其他元素”。但要记住!这些其他元素必须在构造函数的末尾!

class Student(Human):
    def __init__(self,university,std_id,first_year_of_registration,study_program, *args, **kwargs):
        super(Student,self).__init__(*args, **kwargs)
        ...

它基本上捕获所有位置参数(args)和关键字参数(kwargs),并将它们进一步传递。

正如我所说,它只从头开始接受参数,因此您需要这样做:

Student('school',2017159,2017,'SE', 'mark','2000-1-1','M','country')

解释器看到它的方式,它将采用第一个参数并将其放在university中,然后将第二个参数放在std_id中,直到study_program,然后将其余参数放入列出args