Python3 教學#05 (Ch9: Class: 繼承、建構子、多型、封裝、覆 ...
文章推薦指數: 80 %
本文會介紹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
插入/編輯連結
關閉
請輸入目標網址
網址
連結文字
在新分頁中開啟連結
或連結到現有的內容
搜尋
尚未指定搜尋詞彙。
以下顯示最近發佈的項目。
搜尋或使用向上/向下鍵以選取項目。
取消
延伸文章資訊
- 1Python3 教學#05 (Ch9: Class: 繼承、建構子、多型、封裝、覆 ...
本文會介紹Python的Class類別相關語法: Python Class繼承、多型、封裝、建構子、變數、父類別的屬性/方法如何使用、覆載的語法Python也是物件導向 ...
- 2[Python物件導向]Python繼承(Inheritance)實用教學
也就是因為Python的所有類別(Class)直接或間接的繼承(Inheritance)了物件類別(object),所以我們可以看到第二個print()的結果為True。 二、方法覆寫(Meth...
- 3[Python物件導向]淺談Python類別(Class) - Learn Code With Mike
- 4關於Python的類別(Class)...基本篇 - 張凱喬- Medium
我覺得Class是Python速成班最重要的一環因為一般我們在寫Python時一定會用到模組(package). 而模組為了有架構的呈現功能一定是好由幾個py檔組成這些py ...
- 5Python class設計· parallel_processing