Python的物件與類別 - HackMD
文章推薦指數: 80 %
Python的物件與類別## Python以物件(object)的方式看待、處理資料Python是一種`物件導向程式語言`,從資料、變數到函式,都被視為「物件」(Object)來處理,物件包含.
ownedthisnote
Published
LinkedwithGitHub
Like
Bookmark
Subscribe
Edit
#Python的物件與類別
##Python以物件(object)的方式看待、處理資料
Python是一種`物件導向程式語言`,從資料、變數到函式,都被視為「物件」(Object)來處理,物件包含以下元素
-`名稱`:用來稱呼這個物件
-`資料型態`:設定物件的用途
-`唯一的id`:用來區別不同物件
-`值`:真正的資料內容
-`參考計數`:追蹤這物件被使用的頻率
例如宣告一個變數`x=1`,在Python的設計觀點:
-使用者宣告了一個`變數物件`,賦予`名稱`為`x`
-系統賦予一個識別用的id
-這個物件的資料值指定為`1`
-因為存放數值`1`,此物件資料型態是`integer`
以上是Python內建的資料型別變數物件,在這個章節中,我們將介紹,使用者怎麼自訂物件,處理客製化資料。
##什麼是物件
`物件(object)`是一種資料型態,由`屬性(Attribute)`與`方法(Method)`組成。
屬性以**變數**形式表示,一個物件可以包含多個屬性,例如一個多邊形物件的顏色、長度。
方法以**函式**來表示,一個物件可以包含多個函式,例如一個多邊形物件可以被計算面積、體積
##什麼是類別
`類別(Class)`,就是用來建立物件的方法。
你必須定義類別,來指出一個物件包含哪些屬性跟方法。
###定義類別
例如你想定義一個銀行帳號的物件
-屬性包括帳號代碼(number)跟戶名(name)、跟餘額(balance)
-方法包括存款(deposit)與提款(withdraw)
參考語法如下。
```python=
classAccount:
def__init__(self,number,name):
self.number=number
self.name=name
self.balance=0
defdeposit(self,amount):#存款動作:amount代表存入金額
ifamount<=0:
print('mustbepositive')
self.balance+=amount
defwithdraw(self,amount):#取款動作:amount代表取款金額
ifamount<=self.balance:
self.balance-=amount
else:
print('balancenotenough')
```
###從類別中建立物件
通常也被稱為`實例(Instance)`
延續上面的程式碼,我們建立兩個帳號資料物件,分別是:
-Account1
-number:`S00001`
-name:`AAA`
-Account2
-number:`S00002`
-name:`BBB`
參考程式碼如下:
```python=
classAccount:
def__init__(self,number,name):
self.number=number
self.name=name
self.balance=0
defdeposit(self,amount):#存款動作:amount代表存入金額
ifamount<=0:
print("Error!")
self.balance+=amount
defwithdraw(self,amount):#取款動作:amount代表取款金額
ifamount<=self.balance:
self.balance-=amount
else:
print("Error!")
#建立account1
account1=Account("S00001","AAA")
account1.deposit(1000)#存入1000
print(account1.balance)
#建立account2
account2=Account("S00002","BBB")
account2.deposit(2000)#存入2000
print(account2.balance)
```
###不預先定義屬性的作法
```python=
classAccount:
pass
defdeposit(acct,amount):
ifamount<=0:
raiseValueError('mustbepositive')
acct.balance+=amount
defwithdraw(acct,amount):
ifamount<=acct.balance:
acct.balance-=amount
else:
raiseRuntimeError('balancenotenough')
acct=Account()
acct.number='123-456-789'
acct.name='Justin'
acct.balance=0
print(acct.number)#123-456-789
print(acct.name)#Justin
deposit(acct,100)
print(acct.balance)#100
withdraw(acct,50)
print(acct.balance)#50
```
###隨堂練習
:::info
請宣告一個class`CRectangle`(長方形類別)
-它的屬性包括長`width`跟寬`height`
-函式是`area(width,height)`,用來計算面積
請使用此class,生成一個長寬2x3的`rectangle1`物件,並且呼叫他的`area`方法,輸出它的面積
:::
:::spoiler參考程式碼
```python=
classCRectangle:
def__init__(self,width,height):
self.width=width
self.height=height
defarea(self):
area=self.width*self.height
returnarea
rectangle1=CRectangle(2,3)
rectangle1.area()
print(rectangle1.area())
```
:::
###類別的繼承
我們從這個例子出發,有兩個class,都有`drive`這個方法,根據物件導向設計原則,我們應該使用`繼承`這個技巧,來優化程式碼,方便後續維護。
```python=
#汽車類別
classCar:
#駕駛方法
defdrive(self):
print("drivemethodiscalled.")
#加速方法
defaccelerate(self):
print("acceleratemethodiscalled.")
#飛機類別
classAirplane:
#駕駛方法
defdrive(self):
print("drivemethodiscalled.")
#飛行方法
deffly(self):
print("flymethodiscalled.")
```
繼承作法如下,我們新增一個`class`Transpotation,也就是交通工工具的類別,然後讓原本的兩個`class`Car,Airplane繼承它,所以這兩個class都不用再實作自己的`drive`方法了。
```python=
#交通工具(基底類別)
classTransportation:
#建構式
def__init__(self):
self.color="white"#顏色屬性
#駕駛方法
defdrive(self):
print("drivemethodiscalled.")
#汽車子類別
classCar(Transportation):
#加速方法
defaccelerate(self):
print("accelerateismethodcalled.")
#飛機子類別
classAirplane(Transportation):
#飛行方法
deffly(self):
print("flymethodiscalled.")
```
###方法覆寫(MethodOverriding)
當子類別中定義了和父類別同名的方法(Method),這時候子類別的物件(Object)呼叫這個同名方法時,其中的實作內容將會覆蓋掉父類別的同名方法,這就叫做方法覆寫(MethodOverriding),如下範例:
```python=
#交通工具(基底類別)
classTransportation:
#駕駛方法
defdrive(self):
print("Baseclassdrivemethodiscalled.")
#汽車子類別
classCar(Transportation):
#駕駛方法
defdrive(self):
print("Subclassdrivemethodiscalled.")
car1=Car()
car1.drive()
```
如果我們想在子類別中執行父類別的方法時,則可以使用`super()`內建方法來達成,如下範例:
```python=
#交通工具(基底類別)
classTransportation:
#駕駛方法
defdrive(self):
print("Baseclassdrivemethodiscalled.")
#汽車子類別
classCar(Transportation):
#駕駛方法
defdrive(self):
super().drive()
print("Subclassdrivemethodiscalled.")
car1=Car()
car1.drive()
```
從執行結果可以看到,子類別透過`super()`內建方法執行父類別的`drive()`方法後,接著執行子類別的方法後續實作。
##隨堂練習
:::info
請創造一個class,`CPolygon`多邊形
-屬性有`line1`,`line2`
-方法有`area()`計算面積
再宣告兩個class,`CTriangle`與`CRectangle`,繼承`CPolygon`,各自實作自己的`area()`進行面積計算。
-`CTriangle.area()`:三角形面積公式
-`CRectangle.area()`:長方形面積公式
請使用以上兩個class,各自生成物件`triangle1(2,3)`和`rectangle1(2,3)`,並且使用它們的方法,計算面積並輸出。
:::
:::spoiler參考程式碼
```python=
classCPolygon:
def__init__(self,line1,line2):
self.line1=line1
self.line2=line2
defarea(self):
print("area")
classCTriangle(CPolygon):
defarea(self):
area=(self.line1*self.line2)/2
returnarea
classCRectangle(CPolygon):
defarea(self):
area=self.line1*self.line2
returnarea
triangle1=CTriangle(2,3)
print(triangle1.area())
rectangle1=CRectangle(2,3)
print(rectangle1.area())
```
:::
##類別的進階使用技巧
-多重繼承
-屬性存取
-聚合與組合
######tags:`Python程式設計入門`
×
Signin
Email
Password
Forgotpassword
or
Byclickingbelow,youagreetoourtermsofservice.
SigninviaFacebook
SigninviaTwitter
SigninviaGitHub
SigninviaDropbox
NewtoHackMD?Signup
延伸文章資訊
- 1Python類別與例外- 高中資訊科技概論教師黃建庭的教學網站
(A) 類別. 類別像是一個蛋糕的模子,這個蛋糕的模子可以重複製作出相同的蛋糕,就像類別可以宣告出相同的物件,可以讓程式不斷地被重複利用。在Python使用class宣告 ...
- 2[Day 12] 從零開始學Python - 物件與類別:我們不一樣 - iT 邦幫忙
[Day 12] 從零開始學Python - 物件與類別:我們不一樣,每個人都有不同的際遇(上) ... 在Python中會使用ord(),也就是order,將一個字元轉成對應的ASCII Code;
- 3[Python物件導向]淺談Python類別(Class)
Python也提供了一個函式isinstance()來判斷類別(Class)與物件(Object)的關係,語法如下:. isinstance(object_name, class_name).
- 45 Python進階教學2 - iT 邦幫忙
def 副程式a(self, 參數...): 副程式區塊... return 傳回值# 使用類別 # 建立物件,把類別放到變數裡,變成物件(使用時不用加 ...
- 5類別class - Python 教學 - STEAM 教育學習網
當學習Python 到某種程度後,就會開始進入物件導向的領域,而「類別」就是學習物件導向的基礎,這篇教學將會介紹Python 裡的類別class,並進一步說明類別和物件的 ...