<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
編寫類時,並非總是要從空白開始,如果編寫的類是另一個現成類的特殊版本,可使用繼承,繼承分為單繼承和多繼承。
一個類繼承另一個類時,將自動獲得另一個類的所有屬性和方法,原有的類稱為父類別,而新類稱為子類。子類繼承了父類別所有的屬性和方法,同時還可以定義自己的屬性和方法,這樣一來就解決了類類與類之間程式碼冗餘的問題
那麼兒子怎麼檢視自己的父親是誰呢?
如下所示:
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'>)
優點:子類可以同時遺傳多個父類別的屬性,最大限度地重用程式碼 缺點:違背倫理道德,一個兒子可以有多個爹,體現在程式中則為程式碼地可讀性變差。
繼承查詢的順序:
物件>子類>父類別>父父類別
舉例:
class Fu(): def f1(self): print('Fu.f1') def f2(self): print('Fu.f2') self.f1()#物件名.方法(),此時的self==objects class son(Fu): def f1(self): print('son.f1') objects=son() objects.f2()
根據繼承查詢的順序,物件>子類>父類別>父父類別,先在objects空間範圍內查詢f2,如果未找到,再去子類空間範圍內查詢,最後再去父類別空間範圍內查詢。
Foo.f2 Bar.f1
在既有類的基礎上編寫新類的時候,通常要呼叫父類別的方法__init__(),這將初始化再父類別__init__()方法中定義的所有屬性,從而讓子類包含這些屬性。
舉例:
#定義一個父類別Car,父類別又名超類,名稱super由此而來 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 #定義一個子類ELectricCar,建立子類時,父類別必須包含在當前的檔案,父類別必須位於子類的前面 class ELectricCar(Car):#定義子類時,必須在圓括號內指定父類別的名稱 #方法__init__()接受建立Car範例所需的資訊 def __init__(self,make,model,year): print("__init__()方法被呼叫") #讓python呼叫Car類的方法__init__(),讓子類建立的範例包含父類別這個方法中定義的所有屬性 super().__init__(make,model,year)#super是一個特殊函數,使我們能夠呼叫父類別的方法 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__()方法被呼叫 tesla 2019 model s 2019 Tesla Model S
對於上述程式碼,我們只是想檢視子類ELectricCar是否繼承了父類別Car所擁有的屬性,但是子類本身,我們並沒有給他設定自身屬性和方法。
給子類定義屬性和方法:
讓一個類繼承另一個類後,就可以新增區分子類和父類別所需的新屬性和新方法了。
下面來新增一個電動車特有的屬性,以及描述該屬性的方法:
依然選用上面的程式碼:
#定義一個父類別Car,父類別又名超類,名稱super由此而來 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 #定義一個子類ELectricCar,建立子類時,父類別必須包含在當前的檔案,父類別必須位於子類的前面 class ELectricCar(Car):#定義子類時,必須在圓括號內指定父類別的名稱 #方法__init__()接受建立Car範例所需的資訊 def __init__(self,make,model,year): print("__init__()方法被呼叫") #讓python呼叫Car類的方法__init__(),讓子類建立的範例包含父類別這個方法中定義的所有屬性 super().__init__(make,model,year)#super是一個特殊函數,使我們能夠呼叫父類別的方法 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()
這時,我們給子類新增了它的專有屬性describle_battery_size:
#__init__()方法被呼叫 2019 Tesla Model S this car a 75-kwl battery
下面我們主要對新新增的子類專有屬性進行分析:
def __init__(self,make,model,year): print("__init__()方法被呼叫") #讓python呼叫Car類的方法__init__(),讓子類建立的範例包含父類別這個方法中定義的所有屬性 super().__init__(make,model,year)#super是一個特殊函數,使我們能夠呼叫父類別的方法 self.battery_size=75 def describle_battery(self):#關於子類ELectricCar特有的描述 print(f"this car a {self.battery_size}-kwl battery")
self.battery_size=75為子類特有屬性,因此寫在子類的__init__()方法後,根據子類ELectricCar建立的所有範例都將把包含該屬性,但所有的Car範例都不包含它。
對於子類的特殊程度沒有任何限制,模擬子類ELectricCar時,可根據所需的準確程度新增任意數量的屬性和方法。
如果一個屬性或方法是任何汽車都有的,而不是子類ELectricCar特有的,就將應將其加入到父類別Car中,而不是加入到子類ELectricCar中,這樣,使用父類別Car類的人將獲得相應的功能,而使用子類ELectricCar的人只能獲得子類特有的屬性。
對於父類別的方法,只要他不符合子類模擬的實物的行為,都可以進行重寫,為此。可在子類中定義一個與要重寫的父類別方法同名的方法,這樣,python將不會考慮這個父類別方法,而只關注你在子類中定義的相應方法。
舉例:
假設父類別Car有一個名為fill__gas__tank()的方法,他對於子類ELectricCar來說毫無意義,因此你可能想重寫它,那該怎麼重寫呢?
可在子類中定義一個與要重寫的父類別方法同名的方法
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的方法的相關行為是我們改寫後的,如果不進行改寫,那麼則會輸出不相關的屬性行為。
#__init__()方法被呼叫 2019 Tesla Model S this car doesn't need a gas tank!
使用程式碼模擬實物時,你可能會發現自己給類新增的細節越來越多:屬性和方法清單以及檔案都越來越長,在這種情況下,可能需要將類的一部分提取出來,作為一個單獨的類,可以將大型類拆分成多個協同工作的小類。
例如,不斷給子類ELectricCar新增細節時,我們可能發現其中包含很多專門針對汽車電池的屬性和方法,在這種情況下我們可以將這些屬性和方法提取出來,放在一個名為battery的類中,並將一個battery範例作為子類ELectricCar的屬性:
舉例:
class Car: --snip-- class Battery:#這裡是重寫一個類 def __init__(self,battery_size=10):#該預設值可設定也可不設定 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新新增了一個名為battery的屬性 #讓python建立一個新的Battery範例,並將該範例賦給屬性新建立的屬性battery my_tesla=ELectricCar('tesla','model s',2019) #和上面描述電池容量是一樣的方法 my_tesla.battery.describle_battery()#讓python在範例my_tasla中查詢屬性battery,並對battery進行呼叫
下面我們再向Battery類中新增一個方法用來描述電瓶車的航行距離:
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範例中查詢battery,self.battery=Battery(),對Battery進行呼叫
#__init__被呼叫 this car has a 75-kwl battery this car can go about 260 miles on a full charge
到此這篇關於python重寫方法和重寫特殊構造方法的文章就介紹到這了,更多相關python重寫內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45