您好,登錄后才能下訂單哦!
這篇文章主要講解了“python重寫方法和重寫特殊構(gòu)造方法實(shí)例分析”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“python重寫方法和重寫特殊構(gòu)造方法實(shí)例分析”吧!
編寫類時(shí),并非總是要從空白開始,如果編寫的類是另一個(gè)現(xiàn)成類的特殊版本,可使用繼承,繼承分為單繼承和多繼承。
一個(gè)類繼承另一個(gè)類時(shí),將自動(dòng)獲得另一個(gè)類的所有屬性和方法,原有的類稱為父類,而新類稱為子類。子類繼承了父類所有的屬性和方法,同時(shí)還可以定義自己的屬性和方法,這樣一來(lái)就解決了類類與類之間代碼冗余的問(wèn)題
那么兒子怎么查看自己的父親是誰(shuí)呢?
如下所示:
class Parent_1: pass class Parent_2: pass class sub1(Parent_1):#單繼承 pass #查看自己的父類 print(sub1.__bases__) class sub2(Parent_1,Parent_2):#多繼承 pass #查看自己的父類 print(sub2.__bases__)
(<class '__main__.Parent1'>,) (<class '__main__.Parent1'>, <class '__main__.Parent2'>)
優(yōu)點(diǎn):子類可以同時(shí)遺傳多個(gè)父類的屬性,最大限度地重用代碼 缺點(diǎn):違背倫理道德,一個(gè)兒子可以有多個(gè)爹,體現(xiàn)在程序中則為代碼地可讀性變差。
繼承查找的順序:
對(duì)象>子類>父類>父父類
舉例:
class Fu(): def f1(self): print('Fu.f1') def f2(self): print('Fu.f2') self.f1()#對(duì)象名.方法(),此時(shí)的self==objects class son(Fu): def f1(self): print('son.f1') objects=son() objects.f2()
根據(jù)繼承查找的順序,對(duì)象>子類>父類>父父類,先在objects空間范圍內(nèi)查找f2,如果未找到,再去子類空間范圍內(nèi)查找,最后再去父類空間范圍內(nèi)查找。
Foo.f2 Bar.f1
在既有類的基礎(chǔ)上編寫新類的時(shí)候,通常要調(diào)用父類的方法__init__(),這將初始化再父類__init__()方法中定義的所有屬性,從而讓子類包含這些屬性。
舉例:
#定義一個(gè)父類Car,父類又名超類,名稱super由此而來(lái) class Car: def __init__(self,make,model,year): self.make=make self.model=model self.year=year self.odometer_reading=0 def get_descriptive_name(self): long_name=f"{self.year} {self.make} {self.model}" return long_name.title() def read_odometer(self): print(f"this car has {self.odometer_reading} miles on it ") def update_odometer(self,mileage): if mileage>=self.odometer_reading: self.odometer_reading=mileage else: print("you can't roll back an odometer!") def increment_odometer(self,miles): self.odometer_reading+=miles #定義一個(gè)子類ELectricCar,創(chuàng)建子類時(shí),父類必須包含在當(dāng)前的文件,父類必須位于子類的前面 class ELectricCar(Car):#定義子類時(shí),必須在圓括號(hào)內(nèi)指定父類的名稱 #方法__init__()接受創(chuàng)建Car實(shí)例所需的信息 def __init__(self,make,model,year): print("__init__()方法被調(diào)用") #讓python調(diào)用Car類的方法__init__(),讓子類創(chuàng)建的實(shí)例包含父類這個(gè)方法中定義的所有屬性 super().__init__(make,model,year)#super是一個(gè)特殊函數(shù),使我們能夠調(diào)用父類的方法 my_tesla=ELectricCar('tesla','model s',2019) print(my_tesla.make) print(my_tesla.year) print(my_tesla.model) print(my_tesla.get_descriptive_name())
__init__()方法被調(diào)用 tesla 2019 model s 2019 Tesla Model S
對(duì)于上述代碼,我們只是想查看子類ELectricCar是否繼承了父類Car所擁有的屬性,但是子類本身,我們并沒有給他設(shè)置自身屬性和方法。
給子類定義屬性和方法:
讓一個(gè)類繼承另一個(gè)類后,就可以添加區(qū)分子類和父類所需的新屬性和新方法了。
下面來(lái)添加一個(gè)電動(dòng)車特有的屬性,以及描述該屬性的方法:
依然選用上面的代碼:
#定義一個(gè)父類Car,父類又名超類,名稱super由此而來(lái) class Car: def __init__(self,make,model,year): self.make=make self.model=model self.year=year self.odometer_reading=0 def get_descriptive_name(self): long_name=f"{self.year} {self.make} {self.model}" return long_name.title() def read_odometer(self): print(f"this car has {self.odometer_reading} miles on it ") def update_odometer(self,mileage): if mileage>=self.odometer_reading: self.odometer_reading=mileage else: print("you can't roll back an odometer!") def increment_odometer(self,miles): self.odometer_reading+=miles #定義一個(gè)子類ELectricCar,創(chuàng)建子類時(shí),父類必須包含在當(dāng)前的文件,父類必須位于子類的前面 class ELectricCar(Car):#定義子類時(shí),必須在圓括號(hào)內(nèi)指定父類的名稱 #方法__init__()接受創(chuàng)建Car實(shí)例所需的信息 def __init__(self,make,model,year): print("__init__()方法被調(diào)用") #讓python調(diào)用Car類的方法__init__(),讓子類創(chuàng)建的實(shí)例包含父類這個(gè)方法中定義的所有屬性 super().__init__(make,model,year)#super是一個(gè)特殊函數(shù),使我們能夠調(diào)用父類的方法 self.battery_size=75 def describle_battery(self): print(f"this car a {self.battery_size}-kwl battery") my_tesla=ELectricCar('tesla','model s',2019) print(my_tesla.get_descriptive_name()) my_tesla.describle_battery()
這時(shí),我們給子類添加了它的專有屬性describle_battery_size:
#__init__()方法被調(diào)用 2019 Tesla Model S this car a 75-kwl battery
下面我們主要對(duì)新添加的子類專有屬性進(jìn)行分析:
def __init__(self,make,model,year): print("__init__()方法被調(diào)用") #讓python調(diào)用Car類的方法__init__(),讓子類創(chuàng)建的實(shí)例包含父類這個(gè)方法中定義的所有屬性 super().__init__(make,model,year)#super是一個(gè)特殊函數(shù),使我們能夠調(diào)用父類的方法 self.battery_size=75 def describle_battery(self):#關(guān)于子類ELectricCar特有的描述 print(f"this car a {self.battery_size}-kwl battery")
self.battery_size=75為子類特有屬性,因此寫在子類的__init__()方法后,根據(jù)子類ELectricCar創(chuàng)建的所有實(shí)例都將把包含該屬性,但所有的Car實(shí)例都不包含它。
對(duì)于子類的特殊程度沒有任何限制,模擬子類ELectricCar時(shí),可根據(jù)所需的準(zhǔn)確程度添加任意數(shù)量的屬性和方法。
如果一個(gè)屬性或方法是任何汽車都有的,而不是子類ELectricCar特有的,就將應(yīng)將其加入到父類Car中,而不是加入到子類ELectricCar中,這樣,使用父類Car類的人將獲得相應(yīng)的功能,而使用子類ELectricCar的人只能獲得子類特有的屬性。
對(duì)于父類的方法,只要他不符合子類模擬的實(shí)物的行為,都可以進(jìn)行重寫,為此。可在子類中定義一個(gè)與要重寫的父類方法同名的方法,這樣,python將不會(huì)考慮這個(gè)父類方法,而只關(guān)注你在子類中定義的相應(yīng)方法。
舉例:
假設(shè)父類Car有一個(gè)名為fill__gas__tank()的方法,他對(duì)于子類ELectricCar來(lái)說(shuō)毫無(wú)意義,因此你可能想重寫它,那該怎么重寫呢?
可在子類中定義一個(gè)與要重寫的父類方法同名的方法
class Car: ---snip: def fill_gas_tank(self): self.fill_gas_tank=90 print(f"電瓶車郵箱尺寸的大小是{self.fill_gas_tank}") class ELectricCar(Car): --snip: def fill_gas_tank(self):#與父類中該屬性的方法名相同 print("this car doesn't need a gas tank!") my_tesla=ELectricCar('tesla','model s',2019) print(my_tesla.get_descriptive_name()) my_tesla.fill_gas_tank()
將父類改寫之后,輸出的不符合子類ELectricCar的方法的相關(guān)行為是我們改寫后的,如果不進(jìn)行改寫,那么則會(huì)輸出不相關(guān)的屬性行為。
#__init__()方法被調(diào)用 2019 Tesla Model S this car doesn't need a gas tank!
使用代碼模擬實(shí)物時(shí),你可能會(huì)發(fā)現(xiàn)自己給類添加的細(xì)節(jié)越來(lái)越多:屬性和方法清單以及文件都越來(lái)越長(zhǎng),在這種情況下,可能需要將類的一部分提取出來(lái),作為一個(gè)單獨(dú)的類,可以將大型類拆分成多個(gè)協(xié)同工作的小類。
例如,不斷給子類ELectricCar添加細(xì)節(jié)時(shí),我們可能發(fā)現(xiàn)其中包含很多專門針對(duì)汽車電池的屬性和方法,在這種情況下我們可以將這些屬性和方法提取出來(lái),放在一個(gè)名為battery的類中,并將一個(gè)battery實(shí)例作為子類ELectricCar的屬性:
舉例:
class Car: --snip-- class Battery:#這里是重寫一個(gè)類 def __init__(self,battery_size=10):#該默認(rèn)值可設(shè)定也可不設(shè)定 self.battery_size=battery_size def describle_battery(self): print(f"this car has a {self.battery_size}-kwl battery") class ELectricCar(Car): def __init__(self,make,model,year): super().__init__(make,model,year) self.battery=Battery()#在子類ELectricCar新添加了一個(gè)名為battery的屬性 #讓python創(chuàng)建一個(gè)新的Battery實(shí)例,并將該實(shí)例賦給屬性新創(chuàng)建的屬性battery my_tesla=ELectricCar('tesla','model s',2019) #和上面描述電池容量是一樣的方法 my_tesla.battery.describle_battery()#讓python在實(shí)例my_tasla中查找屬性battery,并對(duì)battery進(jìn)行調(diào)用
下面我們?cè)傧駼attery類中添加一個(gè)方法用來(lái)描述電瓶車的航行距離:
class Car: --snip-- class Battery: --snip-- def get_range(self): if self.battery_size==75: range = 260 elif self.battery_size==100: range = 315 print(f"this car can go about {range} miles on a full charge") class ELectricCar(Car): --snip-- my_tesla=ELectricCar('tesla','model s',2019) my_tesla.battery.describle_battery() my_tesla.battery.get_range()#在my_tesla實(shí)例中查找battery,self.battery=Battery(),對(duì)Battery進(jìn)行調(diào)用
#__init__被調(diào)用 this car has a 75-kwl battery this car can go about 260 miles on a full charge
感謝各位的閱讀,以上就是“python重寫方法和重寫特殊構(gòu)造方法實(shí)例分析”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)python重寫方法和重寫特殊構(gòu)造方法實(shí)例分析這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。