Python實現子類調用父類方法


轉載自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對象,這個對象負責進行方法解析,解析過程其會自動查找所有的父類以及父類的父類。

方法一更直觀;

方法二可以一次初始化所有超類.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM