or
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up
Syntax | Example | Reference | |
---|---|---|---|
# Header | Header | 基本排版 | |
- Unordered List |
|
||
1. Ordered List |
|
||
- [ ] Todo List |
|
||
> Blockquote | Blockquote |
||
**Bold font** | Bold font | ||
*Italics font* | Italics font | ||
~~Strikethrough~~ | |||
19^th^ | 19th | ||
H~2~O | H2O | ||
++Inserted text++ | Inserted text | ||
==Marked text== | Marked text | ||
[link text](https:// "title") | Link | ||
 | Image | ||
`Code` | Code |
在筆記中貼入程式碼 | |
```javascript var i = 0; ``` |
|
||
:smile: | ![]() |
Emoji list | |
{%youtube youtube_id %} | Externals | ||
$L^aT_eX$ | LaTeX | ||
:::info This is a alert area. ::: |
This is a alert area. |
On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?
Please give us some advice and help us improve HackMD.
Do you want to remove this version name and description?
Syncing
xxxxxxxxxx
Python 教學/
類別與物件
物件
Python是一種物件導向的程式語言。在Python中,幾乎所有的東西都是一個物件(object)。
類別(class)就像構建物件的「藍圖」,或者說是一個構建物件的函式。
另外,物件中的方法是指在物件裡的函式,物件中的屬性是指物件裡的變數。
創建一個類別 (Class)
要創建一個類,使用關鍵字
class
。例如創建一個名為
MyClass
的類別,他有一個名為x
的實例屬性。注意縮排
構建物件
我們可以使用名為
MyClass
的類別來構建物件。在物件中的變數叫作屬性。例如構建一個名為
p1
的物件,該物件含有屬性x
。可以稍微將有回傳東西的函式與類別做連結,但物件在函式之上,因為我們可以從它裡面取用東西
練習 1.1
試寫一個類別,該類別含有一個
int
變數x
、一個空的list
和一個空的dict
。修改物件屬性
我們可以像下面這樣修改用上面構建出來的物件裡的屬性(變數)。
練習 1.2
承上題,將你定義的那個空的
list
使用append
放入一個int
變數1
,再將你定義的那個空的dict
放入鍵值對'Mandy':327
。Coding Style
通常類別取名字的時候首字母會大寫,比容易讓人認得出這是個類別。由於物件是變數,所以可以不用管,但有一派是不管物件或類別都取首字母大寫的名字。另外函式都建議首字母小寫,不會變的變數(constant)用全大寫。
物件的構建函式
物件除了變數外也可以有函式。不過在物件裡函式叫作方法。
所有的類別都有一個叫做
__init__()
的函式,它總是在類別被構建成物件時執行。使用
__init__()
函式為物件中的變數賦值,或者在構建物件時進行其他操作。例如構建一個名為
Person
的類別,使用__init__()
函式為name
和age
賦值。self
是對類別的代稱,用於類別中函式的呼叫或變數的引用。注意:每次用類別構建新物件時,都會自動呼叫類別的
__init__()
方法。前面的程式碼相當於
注意:物件的屬性可以隨你變動
練習 2.1
試寫一個名叫
MyHello
的類別,使該類別在構件時印出 Hello。練習 2.2
試寫一個名叫
MyString
的類別,使該類別在構件時印出字串s
。類別屬性(Instance Attribute)與實例屬性(Class Attribute)
在一個類別中,我們有些屬性是可以共用的,例如
可以看到,只要我們修改類別的屬性,所有的屬性都會受到影響
物件的方法
物件除了變數外也可以有函式。不過在物件裡函式叫作方法。
讓我們在上面的
Person
類別中寫一個方法。插入一個輸出問候語的函式,並在
p1
物件上執行。注意:引數
self
是實例的代稱,用於類別中對實例方法的呼叫或屬性的引用。練習 3
試寫一個名為
BMItable
的類別,使該類別擁有紀錄人的名字、身高、體重和BMI的能力,規格如下。self
參數self
視作實例方法第一個傳入的引數,用於實例中方法的呼叫或屬性的引用。不一定要命名為
self
,你可以隨心所欲地調用它,但它必須是類中任何函式的第一個參數。例如,用
mysillyobject
和abc
兩個詞代替self
。不過不要這麼做好嗎= =,一般來說我們還是會以
self
作為傳入的那個實例的命名繼承
Python 中類別間可以繼承–-允許我們定義一個複製另一個類別的所有方法和屬性的類別。
父類別(Parent class)是被繼承的類別,也叫基底類別。
子類別(Child class)是繼承自另一個類別的類別,也叫衍生類別。
父類別
任何類別都可以是父類別,因此語法與寫任何其他類別一樣,接下來所指的父類別都會是以下例子。
例如我們寫一個名為
Person
的類別,它具有firstname
和lastname
屬性,以及一個名為printname
的方法:使用
Person
類別構建一個物件,然後呼叫printname
方法:子類別
若要寫出一個子類別–-繼承其他類別的類別,請在寫子類別的時後將父類別作為引數傳入:
例如我們寫一個名為
Student
的類別,將該類別繼承Person
的屬性和方法:現在,類別
Student
具有與類別Person
相同的屬性和方法。使用類別
Student
構建一個物件,然後呼叫printname
方法:你也可以再使用Person 來構建,目前來說用法一樣
練習 4.1
試著用名為
BMItable2
的類別繼承練習 3 的BMItable
練習 4.2
試著用名為
BMItable2
的類別繼承練習 3 的BMItable
並且新增method
secret(name)
,使該name擁有的身高、體重、BMI都變成'xxx'__init __()
函式的複寫到目前為止,我們已經成功寫了一個子類別,這個子類別是從父類別複製屬性和方法。
我們要在子類別寫
__init __()
函式(而不是pass關鍵字)。例如我們在
Student
類別裡複寫__init__()
函數。注意:如果在子類別中添加一個與父類別中的方法同名的方法,那麼繼承下來的父類別方法就會被覆蓋。
為了保持對父類別的
__init__()
函式的繼承,可以寫成呼叫父類別的__init__()
函式。例如:使用
super
()函式通過使用
super()
函式,你不需要使用父類別的名字,它會自動繼承父類別的方法和屬性。因為需要多呼叫一個函式,雖然會慢一點,但可讀性高。練習 4.2
承上題(4.1),試著用名為
BMII
的類別繼承練習 3 的BMI
後,印出添加屬性
現在我們已經準備好
__init__()
函式了,還同時繼承了父類別,我們準備在__init__()
函式中進行其他操作。例如我們在Student
類別中多添加一個名為graduationyear
的屬性:在下面的例子中,
108
會是一個變量,並在構建Student
時傳入。要做到這一點,得在__init__()
函式中多寫一個引數。添加一個year
引數,並在構建物件時傳入正確的年份:練習 4.3
承上題(4.2),試著用名為
BMII
的類別繼承練習 3 的BMI
後,多傳入一個dict
定義給bmi
。添加方法
例如我們在
Student
類中添加一個名為welcome
的方法。練習 4.4
試著用名為
BMII
的類別繼承練習 3 的BMI
後,多傳入一個引數年齡。補充
class method
當一個 method 是帶有 class 本身作為參數傳入時,我們稱之為 class method
class method 必須傳入 class 本身作參數,就是cls,概念跟 instance 用 self傳入instance method 的參數一樣。
其實也可以用instance 呼叫class method