日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

【面向对象编程】(4) 类的继承,重构父类中的方法

發(fā)布時(shí)間:2023/11/27 生活经验 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【面向对象编程】(4) 类的继承,重构父类中的方法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

各位同學(xué)好,今天和大家分享一下面向?qū)ο缶幊讨?#xff0c;類的三大特征之繼承。主要介紹:子類繼承父類的基本方法;重寫父類的類方法;重構(gòu)父類的初始化方法;super() 方法本節(jié)主要是單繼承多繼承在下一節(jié)中介紹。如果對基礎(chǔ)知識不太清楚的,可以看一下我的前幾篇博客:https://blog.csdn.net/dgvv4/category_11569694.html?spm=1001.2014.3001.5482

繼承是使子類具有父類的各種屬性和方法,不需要編寫相同代碼。在子類繼承父類的同時(shí),可以重新定義父類中的某些屬性,并重寫某些方法,即覆蓋父類的原有屬性和方法,使其獲得與父類不同的功能。


1. 子類繼承父類的基本方法

首先定義父類 Animal父類中定義的屬性和方法都可以被子類調(diào)用。定義子類時(shí),在子類名后面加括號,括號內(nèi)填入父類的名稱,即可完成對父類的繼承。子類繼承父類? class 子類名(父類名):

子類 Pig?在實(shí)例化時(shí),直接調(diào)用父類的初始化方法,因此子類在初始化時(shí)輸入的屬性與父類相同子類的實(shí)例 pig?可直接調(diào)用父類方法pig.eat(),父類中eat()方法中的第一個(gè)參數(shù) self 是子類的實(shí)例化對象pig

子類 Bird?在定義時(shí),設(shè)置了該子類特有的方法 fly(),子類 Bird 的實(shí)例化對象 bird 既能調(diào)用父類的方法eat(),也能調(diào)用自身的子類方法fly()

#(1)定義父類
class Animal:  life_val = 100  # 定義父類的屬性    # 父類初始化def __init__(self, name:str, age:int, sex:str):# 分配屬性self.name = nameself.age = ageself.sex = sex# 定義父類中的方法def eat(self):print(f'{self.name} is eating')#(2)定義子類
# 在類名后面加括號,代表繼承,括號里面填寫父類的名稱    
class Pig(Animal):  # 子類可以調(diào)用父類中的屬性和方法。pass    # 這里子類什么都不寫#(3)定義子類,繼承父類屬性
class Bird(Animal):  # 子類可以調(diào)用父類中的所有屬性和方法# 每個(gè)子類有其特有的方法def fly(self):print(f'{self.name} can fly')#(4)對子類實(shí)例化,子類繼承了父類,傳入屬性時(shí)需要和父類的格式一致
pig = Pig('小花', 5, 'male')
# 調(diào)用父類中的方法
pig.eat()  # 小花 is eating
# 通過子類調(diào)用父類中的屬性
print(pig.life_val)  # 100#(5)對子類實(shí)例化,子類繼承了父類的屬性和方法
bird = Bird('阿偉', 10, 'female')
# 調(diào)用子類自己的方法
bird.fly()  # 阿偉 can fly

2. 子類重寫父類的類方法

子類重寫父類的類方法有兩種。一種是完全重寫父類方法,即不執(zhí)行父類中的某個(gè)類方法,只執(zhí)行子類中重寫的某個(gè)父類的類方法。另一種是在父類的方法上補(bǔ)充,即先執(zhí)行父類中的某個(gè)類方法,再執(zhí)行子類中在父類的某個(gè)方法基礎(chǔ)上新增的幾條命令。

子類 Person1 在定義時(shí),完全重寫父類方法 eat(),其實(shí)例 person1 調(diào)用該方法時(shí),直接執(zhí)行的是子類中的 eat() 方法。而子類 Person2 在定義時(shí),在父類的 eat() 方法上做補(bǔ)充。person2.eat()?先調(diào)用父類方法 Animal.eat() 再執(zhí)行新增加的語句。?

#(1)定義父類
class Animal:  life_val = 100  # 定義父類的屬性    # 初始化def __init__(self, name:str, age:int, sex:str):# 分配屬性self.name = nameself.age = ageself.sex = sex# 定義父類中的方法def eat(self):print(f'{self.name} is eating')#(2)定義子類person1
class Person1(Animal):  # 繼承父類的屬性和方法# 定義子類自身的方法def talk(self):print(f'{self.name} can talk')# 完全重寫父類方法,執(zhí)行時(shí),不執(zhí)行父類中的該方法def eat(self):print(f'{self.name} is happily eating')#(3)定義子類person2
class Person2(Animal): # 繼承父類的屬性和方法# 重寫父類方法:先執(zhí)行父類方法,再執(zhí)行子類方法def eat(self):# 先執(zhí)行父類的方法Animal.eat(self)  # 該self是子類的實(shí)例化對象# 再執(zhí)行子類重寫后的方法print(f'{self.name} is happily eating')#(4)對子類person1實(shí)例化,繼承父類屬性,改寫父類方法
person1 = Person1('阿強(qiáng)', 30, 'male')
# 調(diào)用重寫后的父類方法
person1.eat()  # 阿強(qiáng) is happily eating#(5)對子類Person2實(shí)例化
person2 = Person2('阿偉', 10, 'male')
# 調(diào)用重寫的父類方法
person2.eat()
# 阿偉 is eating
# 阿偉 is happily eating

3. 子類重構(gòu)父類的初始化方法

3.1 完全重寫父類的初始化方法

當(dāng)子類繼承父類后如果不在子類中定義初始化方法,那么子類的初始化方法就和父類的初始化方法相同如果子類定義了自己的初始化方法,那么子類實(shí)例化時(shí)就不會調(diào)用父類的初始化方法

子類 Pig 定義了自身的初始化方法 def __init__(self, name:str, height:int, weight:int),那么在子類實(shí)例化時(shí) pig = Pig('阿強(qiáng)', 50, 200) ,就和父類的初始化方法無關(guān),完全重寫了父類的初始化方法。

#(2)定義父類
class Animal:life_val = 100  # 父類的類屬性 #(2)初始化def __init__(self, name:str, age:int, sex:str):# 分配屬性self.name = nameself.age = ageself.sex = sex# 定義父類的類方法def eat(self):print(f'{self.name} is eating')#(3)定義子類,繼承父類的所有屬性和方法
class Pig(Animal):#(4)完全重寫父類中的初始化方法,不再執(zhí)行父類中的初始化方法def __init__(self, name:str, height:int, weight:int):# 分配屬性self.name = nameself.height = heightself.weight = weight# 定義子類的特有方法def claim(self):print(f"{self.name}'s weight is {self.weight} and height is {self.height}")#(5)實(shí)例化子類,這時(shí)候只需要傳入重寫后的初始化的屬性
pig = Pig('阿強(qiáng)', 50, 200)
# 調(diào)用子類的方法
pig.claim()  # 阿強(qiáng)'s weight is 200 and height is 50

3.2 在父類初始化的基礎(chǔ)上添加新屬性

如果我們只是希望在父類的初始化基礎(chǔ)上添加屬性,仍需要調(diào)用父類中的初始化方法,那我們該怎么做呢。和前面的重構(gòu)父類的類方法類似。這里我們只需要先調(diào)用父類的初始化方法,再添加新的屬性

子類 Pig 在定義時(shí),初始化傳入的屬性在父類屬性的基礎(chǔ)上增加了 weightheight ,為避免重復(fù)寫代碼,因此,先調(diào)用父類初始化方法?Animal.__init__(self, 屬性名),其中 self 子類 Pig 的實(shí)例化對象屬性名子類初始化時(shí)傳入的屬性中和父類初始化相同的屬性。然后再添加新屬性 self.weight = weight 等即可。

這里也調(diào)用了父類的類方法,在子類的 claim() 方法中,先執(zhí)行父類中的?Animal.eat(),再執(zhí)行其他的語句。

#(1)定義父類
class Animal:life_val = 100  # 父類的類屬性 #(2)初始化def __init__(self, name:str, age:int, sex:str):# 分配屬性self.name = nameself.age = ageself.sex = sex# 定義父類的類方法def eat(self):print(f'{self.name} is eating')#(3)定義子類
class Pig(Animal):#(4)在父類初始化屬性的基礎(chǔ)上,添加屬性def __init__(self, name:str, age:int, sex:str, weight:int, height:int):# 調(diào)用父類的初始化方法,減少代碼量。self為子類的實(shí)例對象Animal.__init__(self, name, age, sex)# 添加新的屬性self.weight = weightself.height = height# 定義子類方法def claim(self):# 先執(zhí)行父類中的eat()方法Animal.eat(self)  # 傳入子類的實(shí)例化對象# 執(zhí)行完父類中的方法后在執(zhí)行下面的print(f'{self.name} is {self.age} years old, its weight is {self.weight}')#(5)子類實(shí)例化
pig = Pig('阿花', 5, 'male', 200, 50)
# 調(diào)用子類方法
pig.claim()
# 阿花 is eating
# 阿花 is 5 years old, its weight is 200

4. super() 方法

super() 方法用于子類繼承父類中的方法,和上面類似

子類繼承父類的初始化方法

(1)super( 子類名, self ).__init__( 父類屬性名 )

(2)super( ).__init__( 父類屬性名 )

子類繼承父類的類方法

(1)super( 子類名, self ).父類方法名( 除 self 以外的參數(shù) )

(2)super( ).父類方法名( 除 self 以外的參數(shù)參數(shù) )

如下面代碼中,子類 Pig 在初始化時(shí)調(diào)用父類初始化方法?super(Pig, self).__init__(name, age, sex) ,其中 Pig 是這個(gè)子類的名稱,self 是該子類的實(shí)例化對象,__init__() 中的參數(shù)和父類的初始化屬性名相同。也可以省略super()括號中的參數(shù),變成 super().__init__(name, age, sex) ,這兩種方法是等價(jià)的。

這里的 super() 方法和我們上面介紹的調(diào)用父類的方法是通用的,等價(jià)于??Animal.__init__(self, name, age, sex) ,這種方法更直觀一般用在 python2 里面。

子類 Pig 調(diào)用父類中的類方法?super(Pig, self).eat() ,其中 Pig 是子類名稱,self 是子類的實(shí)例化對象,eat() 是父類中的方法。也可以省略 super() 括號中的參數(shù),變成 super().eat()

也可以使用我們上面用到的?Animal.eat(self) , 同樣能調(diào)用父類中的類方法

#(1)定義父類
class Animal:life_val = 100  # 父類的類屬性 # 初始化def __init__(self, name:str, age:int, sex:str):# 分配屬性self.name = nameself.age = ageself.sex = sex# 定義父類的類方法def eat(self):print(f'{self.name} is eating')#(2)定義子類調(diào)用父類方法
class Pig(Animal):# 初始化def __init__(self, name:str, age:int, sex:str, weight:int, height:int):#(3)調(diào)用父類的初始化方法super(Pig, self).__init__(name, age, sex)# 同 super().__init__(name, age, sex)# 在父類基礎(chǔ)上添加新的屬性self.weight = weightself.height = height# 定義子類方法def claim(self):#(4)調(diào)用父類中的eat方法super(Pig, self).eat()# 同 super().eat()# 執(zhí)行完eat方法之后再執(zhí)行下面的print(f"{self.name} is {self.age} years old, its weight is {self.weight}")#(5)實(shí)例化子類
pig = Pig('阿強(qiáng)', 5, 'male', 200, 50)
# 調(diào)用子類方法
pig.claim()
# 阿強(qiáng) is eating
# 阿強(qiáng) is 5 years old, its weight is 200

總結(jié)

以上是生活随笔為你收集整理的【面向对象编程】(4) 类的继承,重构父类中的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。