Python3 教學#05 (Ch9: Class: 繼承、建構子、多型、封裝、覆 ...

文章推薦指數: 80 %
投票人數:10人

本文會介紹Python的Class類別相關語法: Python Class繼承、多型、封裝、建構子、變數、父類別的屬性/方法如何使用、覆載的語法Python也是物件導向 ... Skiptocontent Python 教學  2018-01-212019-10-12 AndyWang 0Comments Python 本文會介紹Python的Class類別相關語法: PythonClass繼承、多型、封裝、建構子、變數、父類別的屬性/方法如何使用、覆載的語法 Python也是物件導向程式語言,在學習這個部分時,可以帶入Java的觀念來記憶會更深刻喔! (以下語法皆以Python3.6撰寫。

) Class 語法 語法很簡單就是直接使用class關鍵字來完成類別的結構! 定義類別的語法『class類別名稱:』 宣告物件的方法『物件名稱=類別建構子名稱(參數)』 Python classFirstClass: """Myfirstclassinpython.""" str="Apple" deffun(self):#在類別內的函數都至少要傳入參數self return"Helloworld." my_obj=FirstClass()#宣告一個類別為FirstClass的物件 print(my_obj.str)#使用物件的公開變數 print(my_obj.fun())#使用物件的公開函數 12345678910 classFirstClass:    """Myfirstclassinpython."""        str="Apple"    deffun(self):    #在類別內的函數都至少要傳入參數self        return"Helloworld." my_obj=FirstClass()  #宣告一個類別為FirstClass的物件print(my_obj.str)      #使用物件的公開變數print(my_obj.fun())    #使用物件的公開函數 建構子 建構子語法如下: def__init__(self,其他參數): 就算是在建構子裡面self也是必須傳入的參數喔! 值得一提的是Python不支援多建構子(multiconstructor),但是可以透過預設值的方式來達成! def__init__(self,para1=”para1預設值”,para2=”para2預設值2″): 如此一來,就可以有3種宣告方式! 使用類別自己的變數、函數都須要加上『self.變數名稱』才能使用! Python classFirstClass: """Myfirstclassinpython.""" str1="Apple" str2="IBM" def__init__(self,str1="參數1",str2="參數2"): self.str1=str1 self.str2=str2 deffun(self): return"Helloworld." my_obj=FirstClass() print(my_obj.str1) print(my_obj.str2) print("===分隔線===") my_obj2=FirstClass("我是參數1") print(my_obj2.str1) print(my_obj2.str2) print("===分隔線===") my_obj3=FirstClass("我是參數1","我是參數2") print(my_obj3.str1) print(my_obj3.str2) 12345678910111213141516171819202122 classFirstClass:    """Myfirstclassinpython."""    str1="Apple"    str2="IBM"    def__init__(self,str1="參數1",str2="參數2"):        self.str1=str1        self.str2=str2     deffun(self):        return"Helloworld." my_obj=FirstClass()print(my_obj.str1)print(my_obj.str2)print("===分隔線===")my_obj2=FirstClass("我是參數1")print(my_obj2.str1)print(my_obj2.str2)print("===分隔線===")my_obj3=FirstClass("我是參數1","我是參數2")print(my_obj3.str1)print(my_obj3.str2) 執行輸出結果如下: 參數1 參數2 ===分隔線=== 我是參數1 參數2 ===分隔線=== 我是參數1 我是參數2 12345678 參數1參數2===分隔線===我是參數1參數2===分隔線===我是參數1我是參數2   Class繼承 PythonClass的繼承也很簡單!語法如下: class類別名稱(父類別): 繼承父類別要記得實作父類別的建構子,像是下列第16行那樣! Python classCar: wheels_number=4#輪胎數量 car_doors=4#車門數量 passengers=4#乘客數量 def__init__(self,wheels_number=4,car_doors=4,passengers=4): self.wheels_number=wheels_number self.car_doors=car_doors self.passengers=passengers #SUV也是一種車子,所以繼承Car classSUV(Car): brand_name=""#品牌名稱 air_bag=2#安全氣囊數 sunroof=True#是否擁有天窗 def__init__(self,wheels_number,car_doors,passengers,brand_name="",air_bag=2,sunroof=False): super().__init__(wheels_number,car_doors,passengers) self.brand_name=brand_name self.air_bag=air_bag self.sunroof=sunroof defgetDetails(self): print("====Details====") print("Brand:",self.brand_name) print("Wheelsnumber:",self.wheels_number)#可直接呼叫父類別的變數(屬性) print("Doorsnumber:",self.car_doors)#可直接呼叫父類別的變數(屬性) print("Air-bagsnumber:",self.air_bag) print("Sunroof:",self.sunroof) print("=================") #宣告一台ToyotaRAV的休旅車(SUV) toyota_rav=SUV(4,5,5,"ToyotaRAV",4,True) toyota_rav.getDetails() #宣告一台BMWX5的休旅車 bmw_x5=SUV(4,5,5,"BMWX5",6,True) bmw_x5.getDetails() 1234567891011121314151617181920212223242526272829303132333435 classCar:    wheels_number=4      #輪胎數量    car_doors=4          #車門數量    passengers=4        #乘客數量    def__init__(self,wheels_number=4,car_doors=4,passengers=4):        self.wheels_number=wheels_number        self.car_doors=car_doors        self.passengers=passengers #SUV也是一種車子,所以繼承CarclassSUV(Car):    brand_name=""        #品牌名稱    air_bag=2            #安全氣囊數    sunroof=True        #是否擁有天窗    def__init__(self,wheels_number,car_doors,passengers,brand_name="",air_bag=2,sunroof=False):        super().__init__(wheels_number,car_doors,passengers)        self.brand_name=brand_name        self.air_bag=air_bag        self.sunroof=sunroof     defgetDetails(self):        print("====Details====")        print("Brand:",self.brand_name)        print("Wheelsnumber:",self.wheels_number)    #可直接呼叫父類別的變數(屬性)        print("Doorsnumber:",self.car_doors)        #可直接呼叫父類別的變數(屬性)        print("Air-bagsnumber:",self.air_bag)        print("Sunroof:",self.sunroof)        print("=================") #宣告一台ToyotaRAV的休旅車(SUV)toyota_rav=SUV(4,5,5,"ToyotaRAV",4,True)toyota_rav.getDetails()#宣告一台BMWX5的休旅車bmw_x5=SUV(4,5,5,"BMWX5",6,True)bmw_x5.getDetails()   多型 定義兩種繼承Car的類別(SUV,Bus),同時也直接覆載(overwrite)父類別已經定義的方法! 撰寫方法如下,直接在子類別中覆載覆類別的方法即可! Python classCar: #wheels_number:輪胎數量,car_doors:車門數量,passengers:乘客數量 def__init__(self,wheels_number=4,car_doors=4,passengers=4): self.wheels_number=wheels_number self.car_doors=car_doors self.passengers=passengers defdrive(self): print("Driveacar.") #SUV也是一種車子,所以繼承Car classSUV(Car): #brand_name:品牌名稱,air_bag:安全氣囊數,sunroof:是否擁有天窗 def__init__(self,wheels_number,car_doors,passengers,brand_name="",air_bag=2,sunroof=False): super().__init__(wheels_number,car_doors,passengers) self.brand_name=brand_name self.air_bag=air_bag self.sunroof=sunroof #覆寫父類別的drive defdrive(self): print("Drivethis{0}tomyvacation.".format(self.brand_name)) defgetDetails(self): print("====Details====") print("Brand:",self.brand_name) print("Wheelsnumber:",self.wheels_number)#可直接呼叫父類別的變數(屬性) print("Doorsnumber:",self.car_doors)#可直接呼叫父類別的變數(屬性) print("Air-bagsnumber:",self.air_bag) print("Sunroof:",self.sunroof) print("=================") #Bus也是一種車子,所以繼承Car classBus(Car): #brand_name:品牌名稱,air_bag:安全氣囊數,sunroof:是否擁有天窗 def__init__(self,wheels_number,car_doors,passengers,brand_name="",air_bag=0): super().__init__(wheels_number,car_doors,passengers) self.brand_name=brand_name self.air_bag=air_bag #覆寫父類別的drive defdrive(self): print("Takethis{0}tomyvacation.".format(self.brand_name)) defgetDetails(self): print("====Details====") print("Brand:",self.brand_name) print("Wheelsnumber:",self.wheels_number)#可直接呼叫父類別的變數(屬性) print("Doorsnumber:",self.car_doors)#可直接呼叫父類別的變數(屬性) print("Air-bagsnumber:",self.air_bag) print("=================") #宣告一台ToyotaRAV的休旅車(SUV) toyota_rav=SUV(4,5,5,"ToyotaRAV",4,True) #宣告一台BMWX5的休旅車 bmw_x5=SUV(4,5,5,"BMWX5",6,True) #宣告一台VolvoBus的巴士 volvo_bus=Bus(4,3,50,"VolvoBus",0) #分別呼叫各種車輛的drive()方法 defletsDrive(cars): forcarincars: car.drive() letsDrive([toyota_rav,bmw_x5,volvo_bus]) 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 classCar:    #wheels_number:輪胎數量,car_doors:車門數量,passengers:乘客數量    def__init__(self,wheels_number=4,car_doors=4,passengers=4):        self.wheels_number=wheels_number        self.car_doors=car_doors        self.passengers=passengers    defdrive(self):        print("Driveacar.") #SUV也是一種車子,所以繼承CarclassSUV(Car):    #brand_name:品牌名稱,air_bag:安全氣囊數,sunroof:是否擁有天窗    def__init__(self,wheels_number,car_doors,passengers,brand_name="",air_bag=2,sunroof=False):        super().__init__(wheels_number,car_doors,passengers)        self.brand_name=brand_name        self.air_bag=air_bag        self.sunroof=sunroof    #覆寫父類別的drive    defdrive(self):        print("Drivethis{0}tomyvacation.".format(self.brand_name))     defgetDetails(self):        print("====Details====")        print("Brand:",self.brand_name)        print("Wheelsnumber:",self.wheels_number)    #可直接呼叫父類別的變數(屬性)        print("Doorsnumber:",self.car_doors)        #可直接呼叫父類別的變數(屬性)        print("Air-bagsnumber:",self.air_bag)        print("Sunroof:",self.sunroof)        print("=================") #Bus也是一種車子,所以繼承CarclassBus(Car):    #brand_name:品牌名稱,air_bag:安全氣囊數,sunroof:是否擁有天窗    def__init__(self,wheels_number,car_doors,passengers,brand_name="",air_bag=0):        super().__init__(wheels_number,car_doors,passengers)        self.brand_name=brand_name        self.air_bag=air_bag     #覆寫父類別的drive    defdrive(self):        print("Takethis{0}tomyvacation.".format(self.brand_name))     defgetDetails(self):        print("====Details====")        print("Brand:",self.brand_name)        print("Wheelsnumber:",self.wheels_number)  #可直接呼叫父類別的變數(屬性)        print("Doorsnumber:",self.car_doors)  #可直接呼叫父類別的變數(屬性)        print("Air-bagsnumber:",self.air_bag)        print("=================") #宣告一台ToyotaRAV的休旅車(SUV)toyota_rav=SUV(4,5,5,"ToyotaRAV",4,True)#宣告一台BMWX5的休旅車bmw_x5=SUV(4,5,5,"BMWX5",6,True)#宣告一台VolvoBus的巴士volvo_bus=Bus(4,3,50,"VolvoBus",0)#分別呼叫各種車輛的drive()方法defletsDrive(cars):    forcarincars:        car.drive() letsDrive([toyota_rav,bmw_x5,volvo_bus]) 執行結果如下: DrivethisToyotaRAVtomyvacation. DrivethisBMWX5tomyvacation. TakethisVolvoBustomyvacation. 123 DrivethisToyotaRAVtomyvacation.DrivethisBMWX5tomyvacation.TakethisVolvoBustomyvacation.   特殊用法 物件與物件之間的互動可以透過覆載下列特殊方法來個別定義! 特殊方法,例如:物件1>物件2 def__gt__(self,other): 以這種來實作比較self/other的屬性或方法等等的功能! 方法名稱 用途 __lt__ 小於() __ge__ 大於等於(>=) __add__ + __iadd__ += __sub__ – __isub__ -= __mul__ * __imul__ *= __truediv__ / __itruediv__ /= __floordiv__ // __ifloordiv__ //= __mod__ % __imod__ %= __pow__ ** __ipow__ **= Python classCar: #wheels_number:輪胎數量,car_doors:車門數量,passengers:乘客數量 def__init__(self,wheels_number=4,car_doors=4,passengers=4): self.wheels_number=wheels_number self.car_doors=car_doors self.passengers=passengers defdrive(self): print("Driveacar.") #SUV也是一種車子,所以繼承Car classSUV(Car): #brand_name:品牌名稱,air_bag:安全氣囊數,sunroof:是否擁有天窗 def__init__(self,wheels_number,car_doors,passengers,brand_name="",air_bag=2,sunroof=False): super().__init__(wheels_number,car_doors,passengers) self.brand_name=brand_name self.air_bag=air_bag self.sunroof=sunroof #回傳自己的安全氣囊數是否大於其他人的安全氣囊數的真假值 def__gt__(self,other): returnself.air_bag>other.air_bag #覆寫父類別的drive defdrive(self): print("Drivethis{0}tomyvacation.".format(self.brand_name)) defgetDetails(self): print("====Details====") print("Brand:",self.brand_name) print("Wheelsnumber:",self.wheels_number)#可直接呼叫父類別的變數(屬性) print("Doorsnumber:",self.car_doors)#可直接呼叫父類別的變數(屬性) print("Air-bagsnumber:",self.air_bag) print("Sunroof:",self.sunroof) print("=================") #宣告一台ToyotaRAV的休旅車(SUV) toyota_rav=SUV(4,5,5,"ToyotaRAV",4,True) #宣告一台BMWX5的休旅車 bmw_x5=SUV(4,5,5,"BMWX5",6,True) #來判斷bmw_x5的安全氣囊數是否大於toyota_rav print(bmw_x5>toyota_rav) 123456789101112131415161718192021222324252627282930313233343536373839404142 classCar:    #wheels_number:輪胎數量,car_doors:車門數量,passengers:乘客數量    def__init__(self,wheels_number=4,car_doors=4,passengers=4):        self.wheels_number=wheels_number        self.car_doors=car_doors        self.passengers=passengers    defdrive(self):        print("Driveacar.") #SUV也是一種車子,所以繼承CarclassSUV(Car):    #brand_name:品牌名稱,air_bag:安全氣囊數,sunroof:是否擁有天窗    def__init__(self,wheels_number,car_doors,passengers,brand_name="",air_bag=2,sunroof=False):        super().__init__(wheels_number,car_doors,passengers)        self.brand_name=brand_name        self.air_bag=air_bag        self.sunroof=sunroof     #回傳自己的安全氣囊數是否大於其他人的安全氣囊數的真假值    def__gt__(self,other):        returnself.air_bag>other.air_bag     #覆寫父類別的drive    defdrive(self):        print("Drivethis{0}tomyvacation.".format(self.brand_name))     defgetDetails(self):        print("====Details====")        print("Brand:",self.brand_name)        print("Wheelsnumber:",self.wheels_number)    #可直接呼叫父類別的變數(屬性)        print("Doorsnumber:",self.car_doors)        #可直接呼叫父類別的變數(屬性)        print("Air-bagsnumber:",self.air_bag)        print("Sunroof:",self.sunroof)        print("=================") #宣告一台ToyotaRAV的休旅車(SUV)toyota_rav=SUV(4,5,5,"ToyotaRAV",4,True)#宣告一台BMWX5的休旅車bmw_x5=SUV(4,5,5,"BMWX5",6,True) #來判斷bmw_x5的安全氣囊數是否大於toyota_ravprint(bmw_x5>toyota_rav)     ←Python3教學#04(Ch6~Ch8:Try-catch錯誤處理) Python3&Numpy–教學、筆記→ AndyWang 站在巨人的肩膀上仍須戰戰兢兢! YouMayAlsoLike 使用Ubuntu作為深度學習/機器學習/人工智慧之平台 2018-03-252020-04-03 AndyWang 2 Ubuntu安裝Python3.5,Tensorflow-gpu,jupyter 2018-03-252020-04-03 AndyWang 0 GoogleColaboratory–Google提供的免費Python+Tensorflow-GPU開發環境 2018-02-042020-04-03 AndyWang 0 Python3&Numpy–教學、筆記 2018-01-222019-09-28 AndyWang 1 Python3教學#04(Ch6~Ch8:Try-catch錯誤處理) 2018-01-182020-02-06 AndyWang 0 Python3教學#03(Ch6~Ch8:Module、I/O) 2018-01-172018-01-29 AndyWang 0 發表迴響 取消回覆 這個網站採用Akismet服務減少垃圾留言。

進一步了解Akismet如何處理網站訪客的留言資料。

Thelatestposts rsync–Linux常用指令#03 Shell基礎2-判斷指令執行成功 Apache進階設定(2)-KeepAlive MySQL#01binarylogs設定與屬性 WordPress不斷重新導向 WordPress資料庫大小猛增 CentOS8架站教學彙整 WordPress:SSLFailed:WordPress回報無SSL支援 Shell備份網站資料,config,資料庫 Shell基礎1-宣告,變數,函數,確認檔案存在 CentOS8安裝與設定MySQL8,phpMyAdmin4.9 CentOS8Apache2.4,PHP7.3安裝與設定 CentOS8基礎設定(時區,EPEL,SSH/sFTP,SEManage,wget) Numpy筆記-#02另存變數為.npz Numpy筆記-#01卷積神經網路的Padding 插入/編輯連結 關閉 請輸入目標網址 網址 連結文字 在新分頁中開啟連結 或連結到現有的內容 搜尋 尚未指定搜尋詞彙。

以下顯示最近發佈的項目。

搜尋或使用向上/向下鍵以選取項目。

取消



請為這篇文章評分?