使用super()时为什么会出现类型错误?

时间:2015-12-22 23:04:58

标签: python-3.x inheritance superclass super

我刚刚开始学习Python 3中的类和继承。我想打印一个学生的名字,它继承自超类Person。不幸的是我一直得到一个TypError。

代码:

class Person(object):

    def __init__(self, name="Mike", age = 25, place_of_birth="Stockholm"):
        self.age = age
        self.name = name
        self.place_of_birth = place_of_birth


class Student(Person):

    def __init__(self, name, age, university = "University of Stockholm", gpa = 8):
        super().__init__(name, age)
        self.university = university
        self.gpa = gpa

然后,我想通过致电:

来打印学生的姓名
student1 = Student()
print(student1.name)

但我不断收到此错误消息:

追踪(最近一次通话): TypeError: init ()缺少2个必需的位置参数:'name'和'age'

2 个答案:

答案 0 :(得分:0)

__init__()的{​​{1}}方法需要Student位置参数:2name。您需要在创建新实例时指定这些参数:

age

如果您希望类student1 = Student('eppe2000', 20) print(student1.name) 默认为类Student默认参数,如果尚未指定,则可以这样做:

Person

基本上,您将类class Person(object): def __init__(self, name="Mike", age=25, place_of_birth="Stockholm"): self.age = age self.name = name self.place_of_birth = place_of_birth class Student(Person): def __init__(self, university="University of Stockholm", gpa=8, **kwargs): super().__init__(**kwargs) self.university = university self.gpa = gpa >>> s = Student() >>> s.name 'Mike' >>> s = Student(name="Daniele") >>> s.name 'Daniele' 未知的所有关键字参数转发到其父类。如果您指定了无效的关键字(即:'surname'),那么您将获得Student,因为TypeErrorStudent都没有指定带有关键字'surname'的关键字参数。

如果您需要有关Person的信息,请查看此帖:https://stackoverflow.com/a/36908/3477005

答案 1 :(得分:0)

如果您希望Student始终默认使用Parent类的名称和年龄,那么您不希望Student获取姓名和年龄值。

class Student(Person):
    def __init__(self, university = "University of Stockholm", gpa = 8):
        super().__init__() # runs parent __init__ taking no values
        self.university = university
        self.gpa = gpa

>>> student1 = Student()
>>> student1.name
'Mike'
>>> student1.age
25

当您使用super().__init__(name, age)时,您希望将给予Student类的名称和年龄传递给Parent类。但是既然你不想传递任何东西,那就会出错。

现在,如果您希望Student类能够将值以及默认值设置为父类提供的值,则可以执行此操作。

class Student(Person):
    def __init__(self, name = None, age = None, university = "University of Stockholm", gpa = 8):
        if name is None and age is None:
            super().__init__()
        else:
            super().__init__(name, age)
        self.university = university
        self.gpa = gpa

此处发生的情况是,如果未提供姓名或年龄if name is None and age is None,则默认为Person班级的值。但是,如果同时提供了名称和年龄,那么它将使用这些值。

>>> student1 = Student()
>>> student1.name
'Mike'
>>> student1.age
25
>>> student2 = Student('Bill', 19)
>>> student2.name
'Bill'
>>> student2.age
19