天天看點

Python_子類調用父類的方法

1.方式一

子類調用父類的方法,包含2中形式的調用。一種形式是在類内部通過繼承的方式調用父類的方法,另外一種形式是子類執行個體化後之後通過繼承的方式來調用父類的方法。如下圖所示:

Python_子類調用父類的方法

注意一點,在子類内部通過繼承的方式調用父類的屬性時,必須要帶上self位置參數(self隻在執行個體化過程中和在執行個體調用屬性時才能省略(self本來的含義就是指向執行個體自己));而執行個體在通過繼承調用父類的屬性或方法時,則不用傳self參數,因為執行個體已經執行個體化了呀!!!

該部分的代碼塊如下:注意一點,在子類内部通過繼承的方式調用父類的屬性時,必須要帶上self位置參數(self隻在執行個體化過程中和在執行個體調用屬性時才能省略(self本來的含義就是指向執行個體自己));而執行個體在通過繼承調用父類的屬性或方法時,則不用傳self參數,因為執行個體已經執行個體化了呀!!!

該部分的代碼塊如下:

class Person():
    "人的類"
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
    def eat(self):
        print("%s開始吃飯了"%self.name)
class Student(Person):
    "學生類"
    def __init__(self,name,age,sex,classnaem):
        #子類調用父類的構造函數進行初始化
        Person.__init__(self,name,age,sex)  #通過子類把參數傳給父類(self不能少,self隻有在執行個體化和執行個體調用類時才能省略,此處不是)
        self.classnaem = classnaem
    def course(self):
        print("%s在%s上課"%(self.name,self.classnaem))
    def done(self):
        print("這個學生在幹嘛?")
        #子類調用父類方法
        Person.eat(self)    #子類在調用父類方法必須要傳self
#執行個體化一個子類
student = Student("周明",23,'男',"11屆土木3班")
#調用子類本身的方法
student.course()
#通過子類調用父類的方法--->執行個體化之後來調用父類的方法
student.eat()
#調用子類的方法,在子類方法中調用了子類的方法,與student.eat有差別
student.done()           

複制

此時如果父類的名稱更改了,那麼在子類中所有用到父類名的地方均要進行修改了。所有此種方法不便于後期維護,為此我們選擇方式二。

2.方式二

使用super來代替父類名,以友善代碼的後期維護,見下圖:

Python_子類調用父類的方法

使用super的好處,一是可以代替父類名,這樣後期父類名更改了,我們隻需要更改子類名稱後面的父類名即可,子類中其他的父類名可以不用更改;二是使用了super後,調用父類方法時可以不傳參數self。

該部分的代碼塊為:

class Person():
    "人的類"
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
    def eat(self):
        print("%s開始吃飯了"%self.name)
class Student(Person):
    "學生類"
    def __init__(self,name,age,sex,classnaem):
        #子類調用父類的構造函數進行初始化
        # Person.__init__(self,name,age,sex)  #通過子類把參數傳給父類(self不能少,self隻有在執行個體化和執行個體調用類時才能省略,此處不是)
        #使用super來替換父類名
        super().__init__(name,age,sex)  #通過子類把參數傳給父類,用super可以省略self
        self.classnaem = classnaem
    def course(self):
        print("%s在%s上課"%(self.name,self.classnaem))
    def done(self):
        print("這個學生在幹嘛?")
        #子類調用父類方法
        super().eat()    #子類在調用父類方法,使用super可以省略self
#執行個體化一個子類
student = Student("周明",23,'男',"11屆土木3班")
#調用子類本身的方法
student.course()
#通過子類調用父類的方法--->執行個體化之後來調用父類的方法
student.eat()
#調用子類的方法,在子類方法中調用了子類的方法,與student.eat有差別
student.done()           

複制