2015-12-22 65 views
0

我剛剛開始學習關於Python 3中的類和繼承。我想要打印從超類Person繼承的學生的名稱。不幸的是我不斷得到一個TypError。爲什麼使用super()時會出現類型錯誤?

代碼:

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

您沒有給出init名稱和年齡,就像您聲明的那樣。 '學生()'不會工作,因爲你給它的參數,你現在沒有調用它。 – pvg

回答

0

__init__()方法Student需要2位置參數:nameage。您需要指定這些參數創建新實例時:

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' 

基本上,您將所有類Student未知的關鍵字參數轉發給其父類。不是說如果你指定了一個無效的關鍵字(例如:'surname'),你將得到一個TypeError,因爲StudentPerson都沒有指定關鍵字參數和關鍵字'surname'。

如果您需要了解**kwargs檢查這個職位信息:https://stackoverflow.com/a/36908/3477005

+0

謝謝。但我試圖完成的是,每一個新的學生對象創建,繼承了「名」和「時代」從Person」類,這是最初設置爲‘邁克’,25 – eppe2000

0

如果你想Student總是默認的名字和父類的年齡,那麼你不想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類能夠採取值以及默認的,你可以做到這一點的父類中提供的那些。

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 

這裏會發生什麼情況是,如果沒有名字,年齡從Person類提供if name is None and age is None然後將其默認爲值。但是如果這二者,姓名和年齡,然後它會使用這些值。

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

感謝你們爲您的明確的解釋和屬性迅速回應! @DanielePantaleone – eppe2000

相關問題