轉載自https://www.jianshu.com/p/dfa189850651
這里是說在類定義里調用,而不是指實例的調用。
假設存在類Person與類Student:
class Person(object): def __init__(self): self.name = "Tom" def getName(self): return self.name class Student(Person): def __init__(self): self.age = 12 def getAge(self): return self.age if __name__ == "__main__": stu = Student() print(stu.getName())
運行上面的代碼,將會報以下錯誤:
Traceback (most recent call last): File "test.py", line 18, in <module> print stu.getName() File "test.py", line 6, in getName return self.name AttributeError: Student instance has no attribute 'name'
這是因為盡管Student類繼承了Person類,但是並沒有調用父類的__init__()方法;
那么怎樣調用父類的方法呢?有如下兩種解決方案:
方法一:調用未綁定的父類構造方法
class Person(object): def __init__(self): self.name = "Tom" def getName(self): return self.name class Student(Person): def __init__(self): Person.__init__(self) self.age = 12 def getAge(self): return self.age if __name__ == "__main__": stu = Student() print(stu.getName())
在調用一個實例的方法時,該方法的self參數會被自動綁定到實例上,稱為綁定方法;
如果調用類的方法(比如Person.__init__()),那么就沒有實例會被綁定。這樣就可以自由的提供需要的self參數,這種方法稱為未綁定方法。
方法二:使用super函數
class Person(object): def __init__(self): self.name = "Tom" def getName(self): return self.name class Student(Person): def __init__(self): # Person.__init__(self) super(Student, self).__init__() self.age = 12 def getAge(self): return self.age if __name__ == "__main__": stu = Student() print(stu.getName())
super函數會返回一個super對象,這個對象負責進行方法解析,解析過程其會自動查找所有的父類以及父類的父類。
方法一更直觀;
方法二可以一次初始化所有超類.
