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,較適合開發大型項目
👉🏻 以洗衣服為例:
面向過程(類似手洗):需要實現一個功能的時候,着重過程,需要把每個步驟分析出來並用一個個函數實現,再依次調用函數(每一個步驟都需要親力親為)
面向對象(類似機洗):需要實現一個功能的時候,着重的是找誰去幫忙做這一件事情(偷懶,找別人幫忙做)
類:對一系列具有相同屬性和行為的事物的統稱,是一個抽象概念,不是真實存在的事物
對象:類的具體表現,是類創建一來的真實存在的事物
❗️ 注意:在開發中,先有類,再有對象
類名
屬性:對象的特徵描述,用來說明是什麼樣子的
方法:對象具有的功能(行為),用來說明能夠做什麼
舉例:
| 類名 | 屬性 | 方法 |
|---|---|---|
| 人類 | 身高、體重、年齡... | 走路、說話、學習... |
| 洗衣機類 | 長度、寬度、高度... | 漂洗、速洗... |
基本格式:
xxxxxxxxxxclass 類名: # 類名要符合標識符規定,同時遵循大駝峰命名法,見名知意 代碼塊
xxxxxxxxxxclass Washer: height = 800 # 類屬性# 查看類屬性:類名.屬性名print(Washer.height)# 新增類屬性:類名.屬性名 = 值Washer.width = 450print(Washer.width)輸出結果:
xxxxxxxxxx800450創建對象的過程也叫做「實例化對象」
實例化對象的基本格式:對象名 = 類名()

xxxxxxxxxx# 實例化一個洗衣機對象wa = Washer()print(wa) # 顯示對象在內存中的地址# 第二次實例化wa2 = Washer()print(wa2) # 內存地址不一樣,說明是不同對象,可以實例化多個對象輸出結果:
xxxxxxxxxx<__main__.Washer object at 0x10464bb10><__main__.Washer object at 0x10464bb50>由對象調用的,至少有一個self參數,執行實例方法的時候,自動將調用該方法的對象賦值給self

xxxxxxxxxxclass 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.屬性名

xxxxxxxxxxclass 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'輸出結果:
xxxxxxxxxxfemale我是實例方法Victoria的年齡:18VictoriaVictoria❗ 實例屬性和類屬性的區別:
類屬性屬於類,是公共的,大家都能訪問到
實例屬性屬於對象的,是私有的
只能由對象名訪問,不能由類名訪問
💡 上述方案:每實例化一次,就需要添加一次實例屬性,效率不高
👉🏻 因而一般會用到下方的構造函數⬇️
__init__作用:通常用來做屬性初始化/賦值操作
❗ 注意:在類實例化對象的時候,會被自動調用

xxxxxxxxxxclass Test: def __init__(self): # self--實例方法 print('這是__init__()函數')te = Test() # 實例化對象:對象名 = 類名()輸出結果:
xxxxxxxxxx這是__init__()函數
xxxxxxxxxxclass 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()輸出結果:
xxxxxxxxxxVictoria在打遊戲Victoria的年齡是18,身高是160cm,體重49kg⚠️⚠️但是這樣會固定每一個實例,因此要改成以下這樣⬇️

xxxxxxxxxxclass 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()輸出結果:
xxxxxxxxxxVictoria在打遊戲Victoria的年齡是18,身高是160cm,體重49kgAntonio在打遊戲Antonio的年齡是23,身高是170cm,體重57kg__del__()刪除對象的時候,解釋器會默認調用__del__()方法

先建立一個類:
xxxxxxxxxxclass Person: def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender print('我是__init__()') def __del__(self): print('被銷毀了')👉🏻 同時執行以下代碼時:
xxxxxxxxxxp1 = Person('Antonio', '23', 'Male')print(p1.name)print('這是最後一行代碼') # 正常運行時,不會調用`__del__()`,直至對象執行結束之後,系統會自動調用`__del__()`輸出結果:
xxxxxxxxxx我是__init__()Antonio這是最後一行代碼被銷毀了👉🏻 同時執行以下代碼時:
xxxxxxxxxxp2 = Person('Victoria', '22', 'Female')del p2 # del p2執行時,內存會被立即回收,所以先執行`__del__()`再執行下一行print('這是最後一行代碼')輸出結果:
xxxxxxxxxx我是__init__()被銷毀了這是最後一行代碼💡 程序塊__del__()主要是表示該程序塊/函數已經全部執行結束。一般而言用得比較少
| 目的地 | 超連結 |
|---|---|
| 首頁 | 返回主頁 |
| Python學習 | Python學習 |
| 上一篇 | 12 - 閉包&裝飾器 |
| 下一篇 | 14 - 封裝、單繼承 |