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

问题描述 投票:1回答:1

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

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__()

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

python
1个回答
2
投票
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中。

© www.soinside.com 2019 - 2024. All rights reserved.