我刚刚开始学习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'
答案 0 :(得分:0)
__init__()
的{{1}}方法需要Student
位置参数:2
和name
。您需要在创建新实例时指定这些参数:
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
,因为TypeError
或Student
都没有指定带有关键字'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