13 - 面向對象基礎📄目錄1 面向對象2 類和對象2.1 類的三要素2.2 定義類2.3 創建對象2.4 實例方法和實例屬性2.4.1 實例方法2.4.2 實例屬性3 構造函數 __init__
3.1 基本樣式3.2 例子13.3 例子2(適合常用)4 析構函數 __del__()
導航連結:
💡 主流的兩種編程思想:面向過程、面向對象
面向過程:先分析出解決問題的步驟,再把步驟拆解為一個個方法,是沒有對象去調用的,通過一個個方法的執行解決問題
面向對象:將編程當成一個事物(對象)。對外界來說,事物是直接使用的,不用去管內部的情況,而編程就是設置事物能做什麼事情
👉🏻 舉例:C語言就是面向過程的例子,比較適合開發中小型項目;面向對象的例子有java和python,較適合開發大型項目
👉🏻 以洗衣服為例:
面向過程(類似手洗):需要實現一個功能的時候,着重過程,需要把每個步驟分析出來並用一個個函數實現,再依次調用函數(每一個步驟都需要親力親為)
面向對象(類似機洗):需要實現一個功能的時候,着重的是找誰去幫忙做這一件事情(偷懶,找別人幫忙做)
類:對一系列具有相同屬性和行為的事物的統稱,是一個抽象概念,不是真實存在的事物
對象:類的具體表現,是類創建一來的真實存在的事物
❗️ 注意:在開發中,先有類,再有對象
類名
屬性:對象的特徵描述,用來說明是什麼樣子的
方法:對象具有的功能(行為),用來說明能夠做什麼
舉例:
類名 | 屬性 | 方法 |
---|---|---|
人類 | 身高、體重、年齡... | 走路、說話、學習... |
洗衣機類 | 長度、寬度、高度... | 漂洗、速洗... |
基本格式:
xxxxxxxxxx
class 類名: # 類名要符合標識符規定,同時遵循大駝峰命名法,見名知意
代碼塊
xxxxxxxxxx
class Washer:
height = 800 # 類屬性
# 查看類屬性:類名.屬性名
print(Washer.height)
# 新增類屬性:類名.屬性名 = 值
Washer.width = 450
print(Washer.width)
輸出結果:
xxxxxxxxxx
800
450
創建對象的過程也叫做「實例化對象」
實例化對象的基本格式:對象名 = 類名()
xxxxxxxxxx
# 實例化一個洗衣機對象
wa = Washer()
print(wa) # 顯示對象在內存中的地址
# 第二次實例化
wa2 = Washer()
print(wa2) # 內存地址不一樣,說明是不同對象,可以實例化多個對象
輸出結果:
xxxxxxxxxx
<__main__.Washer object at 0x10464bb10>
<__main__.Washer object at 0x10464bb50>
由對象調用的,至少有一個self參數,執行實例方法的時候,自動將調用該方法的對象賦值給self
xxxxxxxxxx
class Washer:
height = 800 # 類屬性
def wash(self): # self參數是類中的實例方法必須具備的
print('我會洗衣服')
print(f'方法中的self:{self}') # self表示當前調用方法的對象本身
# 實例化對象
wa = Washer()
# 對象調用方法
wa.wash()
輸出結果:
xxxxxxxxxx
我會洗衣服
方法中的self:<__main__.Washer object at 0x1026ffc10>
💡 打印對象和打印self得到的結果是一致的
💡 當對象調用實例方法時,Python會自動將對象本身的引用作為參數,傳遞到實例方法的第一個參數self裡面
格式:self.屬性名
xxxxxxxxxx
class Person:
name = 'Victoria' # 類屬性
def introduce(self): # 實例方法
print('我是實例方法')
print(f'{Person.name}的年齡:{self.age}') # 這裡的Person.name是類屬性,self.age是實例屬性
p1 = Person()
p1.age = 18 # 由於上面沒有定義age屬性,這裡不定義就會報錯
p1.sex = 'female'
print(p1.sex) # 根據對象名訪問實例屬性
# print(Person.sex) # 報錯,實例屬性只能由對象名訪問,不能由類名訪問
p1.introduce()
# 訪問類屬性,類可以訪問到,實例對象也可以訪問到:
print(Person.name)
print(p1.name)
pe2 = Person()
# print(pe2.sex) # 報錯,p1.sex = 'female'是給對象p1新增的實例屬性,其他對象依然沒有這個屬性,除非給其他對象定義
pe2.sex = 'male'
輸出結果:
xxxxxxxxxx
female
我是實例方法
Victoria的年齡:18
Victoria
Victoria
❗ 實例屬性和類屬性的區別:
類屬性屬於類,是公共的,大家都能訪問到
實例屬性屬於對象的,是私有的
只能由對象名訪問,不能由類名訪問
💡 上述方案:每實例化一次,就需要添加一次實例屬性,效率不高
👉🏻 因而一般會用到下方的構造函數⬇️
__init__
作用:通常用來做屬性初始化/賦值操作
❗ 注意:在類實例化對象的時候,會被自動調用
xxxxxxxxxx
class Test:
def __init__(self): # self--實例方法
print('這是__init__()函數')
te = Test() # 實例化對象:對象名 = 類名()
輸出結果:
xxxxxxxxxx
這是__init__()函數
xxxxxxxxxx
class Person:
def __init__(self):
self.name = 'Victoria' # 實例屬性。前面有self或者對象名的都是實例屬性
self.age = '18'
self.weight = '49'
self.height = '160'
def play(self):
print(f'{self.name}在打遊戲')
def intro(self):
print(f'{self.name}的年齡是{self.age},身高是{self.height}cm,體重{self.weight}kg')
# 實例化對象
p1 = Person()
p1.play()
p1.intro()
輸出結果:
xxxxxxxxxx
Victoria在打遊戲
Victoria的年齡是18,身高是160cm,體重49kg
⚠️⚠️但是這樣會固定每一個實例,因此要改成以下這樣⬇️
xxxxxxxxxx
class Person:
def __init__(self, name, age, weight, height): # 使實例化對象時自動調用
self.name = name # 實例屬性。前面有self或者對象名的都是實例屬性
self.age = age
self.weight = weight
self.height = height
def play(self):
print(f'{self.name}在打遊戲')
def intro(self):
print(f'{self.name}的年齡是{self.age},身高是{self.height}cm,體重{self.weight}kg')
# 實例化對象
p1 = Person('Victoria', '18', '49', '160') # 實例化每一個對象都要傳參
p1.play()
p1.intro()
p2 = Person('Antonio', '23', '57', '170')
p2.play()
p2.intro()
輸出結果:
xxxxxxxxxx
Victoria在打遊戲
Victoria的年齡是18,身高是160cm,體重49kg
Antonio在打遊戲
Antonio的年齡是23,身高是170cm,體重57kg
__del__()
刪除對象的時候,解釋器會默認調用__del__()
方法
先建立一個類:
xxxxxxxxxx
class Person:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
print('我是__init__()')
def __del__(self):
print('被銷毀了')
👉🏻 同時執行以下代碼時:
xxxxxxxxxx
p1 = Person('Antonio', '23', 'Male')
print(p1.name)
print('這是最後一行代碼') # 正常運行時,不會調用`__del__()`,直至對象執行結束之後,系統會自動調用`__del__()`
輸出結果:
xxxxxxxxxx
我是__init__()
Antonio
這是最後一行代碼
被銷毀了
👉🏻 同時執行以下代碼時:
xxxxxxxxxx
p2 = Person('Victoria', '22', 'Female')
del p2 # del p2執行時,內存會被立即回收,所以先執行`__del__()`再執行下一行
print('這是最後一行代碼')
輸出結果:
xxxxxxxxxx
我是__init__()
被銷毀了
這是最後一行代碼
💡 程序塊__del__()
主要是表示該程序塊/函數已經全部執行結束。一般而言用得比較少
目的地 | 超連結 |
---|---|
首頁 | 返回主頁 |
Python學習 | Python學習 |
上一篇 | 12 - 閉包&裝飾器 |
下一篇 | 14 - 封裝、單繼承 |