python面向对象(part1)--类和对象
學習筆記
 開發工具:Spyder
文章目錄
- 概述
- 面向過程
- 面向對象
 
- 類和對象
- 舉個例子
 
- 語法
- 定義類
- 創建對象(實例化)
 
- 實例成員
- 實例變量(對象的變量)
- 實例方法(對象的方法)
 
- 類成員
- 類變量
- 類方法
 
- 靜態方法
 
 
概述
① 面向過程:分析解決問題的步驟,然后逐步實現.
 ② 面向對象:找出解決問題的人,然后分配職責.
 ③類:創建對象的模板,是抽象的概念.
 ④對象: 是具體的,存儲的是數據.
 從設計角度講:先有對象,再創建類.
 從編碼角度講:先有類,再創建對象.
 ⑤類與類區別:行為不同.
 對象與對象區別:數據不同.
面向過程
面向過程是分析出解決問題的步驟,然后逐步實現。
- 公式
程序 = 算法 + 數據結構
- 優缺點
優點:所有環節、細節自己掌控。
 缺點:考慮所有細節,工作量大。
面向對象
面向對象是找出解決問題的人,然后分配職責。
- 公式
程序 = 對象 + 交互
- 優點
①思想層面:
 更接近于人的思維方式。
 有利于梳理歸納、分析解決問題。
 ②技術層面:
 高復用:對重復的代碼進行封裝,提高開發效率。
 高擴展:增加新的功能,不修改以前的代碼。
 高維護:代碼可讀性好,邏輯清晰,結構規整。
類和對象
- 類
一個抽象的概念,即生活中的”類別”。
- 對象
類的具體實例,即歸屬于某個類別的”個體”。
- 類是創建對象的”模板”。
數據成員:名詞類型的狀態。
 方法成員:動詞類型的行為。
舉個例子
代碼:
①創建類
 
②創建對象
 
結果:
 
由上述結果可知,創建不同對象的地址會不同。變量w01為大白對象的地址,變量w02為小黃對象的地址.通過對象地址,調用對象方法,會自動傳遞對象地址。
內存圖:
①當程序自上而下運行,運行到我們創建的類時,程序會在內存的方法區內,存放類的代碼和方法的代碼。
 
②當程序運行到創建對象的代碼時【w01 = Bunny("大白", 5, "公")】,程序就會執行__init__()方法。程序會在方法區中找到我們需要執行的語句,然后在內存中再開辟一塊空間(棧幀)。在創建對象,并傳入參數時,我們不僅僅傳入了3個參數【“大白”, 5, “公”】,實際上會(自動的)多傳一個參數(創建的對象的地址)。最后,將Bunny對象賦值給了變量w01。
③當創建完對象后,__init__()方法結束了它的使命,__init__棧幀就弾棧了。
 
④當程序運行到調用對象方法時【w01.eating()】,程序會在內存中再開辟一塊空間(棧幀)。這個eating()方法中只有self一個變量,這個self變量存儲的就是我們之前創建的Bunny對象的內存空間
 
⑤最后,eating()方法結束使命,eating棧幀弾棧。
語法
定義類
- 代碼
- 說明
①類名所有單詞首字母大寫。
 ② _init_ 也叫構造函數,創建對象時被調用。
 ③ self 變量綁定的是被創建的對象。
創建對象(實例化)
變量 = 構造函數(參數列表)實例成員
實例變量(對象的變量)
- 語法
定義實例變量:
對象.變量名調用實例變量:
對象.變量名- 說明
①通過對象.變量名,對實例變量賦值
class Bunny:pass#創建對象(實例化) w01 = Bunny() #通過`對象.變量名`,對實例變量賦值 w01.name = "小黃" print(w01.name) #小黃②通常在構造函數(__init__)中,對實例變量賦值
class Bunny:def __init__(self, name):self.name = name#通常在構造函數中,對實例變量賦值 w01 = Bunny("小黃") print(w01.name) #小黃③通過成員方法,對實例變量賦值
class Bunny:def __init__(self, name):self.name = namedef fun01(self):self.age = 10#通常在構造函數中,對實例變量賦值 w01 = Bunny("小黃") w01.fun01() print(w01.name) #小黃 print(w01.age) #10- 對象的屬性__dict__
實例方法(對象的方法)
- 語法
定義實例方法:
def 方法名稱(self, 參數列表):方法體調用實例方法:
對象地址.實例方法名(參數列表)- 說明
①至少有一個形參,第一個參數綁定調用這個方法的對象,一般命名為"self"
 ②無論創建多少對象,方法只有一個,并且被所有對象共享。
類成員
類變量
類變量在類中,方法外。類變量可以被所有創建的對象所共享。
- 語法
類變量定義:
class 類名:變量名 = 表達式類變量調用:
類名.變量名- 例子1
代碼:
class Bunny:leg = 4def __init__(self, name, age):self.name = nameself.age = ageb01 = Bunny("小黃", 6) print("%s有%d條腿" % (b01.name, Bunny.leg))結果:
 
- 例子2
代碼:
class Store:capacity = 1000def __init__(self, name, extract):self.name = nameself.extract = extractStore.capacity -= extractprint("剩余存儲量", Store.capacity) s01 = Store("A", 20) print("剩余存儲量", Store.capacity) s02 = Store("B", 30) print("剩余存儲量", Store.capacity)結果:
 
內存圖:
①【s01 = Store(“A”, 20)】
 
②【s02 = Store(“B”, 30)】
 
類方法
類方法用于操作類變量。
- 語法
定義類方法:
@classmethod def 方法名稱(cls, 參數列表):方法體調用類方法:
類名.方法名(參數列表)- 說明
①類方法至少有一個形參,第一個形參用于綁定類,一般命名為’cls’
 ②使用@classmethod修飾的目的,是調用類方法時可以隱式傳遞類。
 ③類方法中不能訪問實例成員(實例變量、實例方法),實例方法中可以訪問類成員。
- 例子
代碼:
class Bunny:leg = 4def __init__(self, name, age):self.name = nameself.age = age@classmethoddef count_leg(cls):print("兔兔腿數:", cls.leg)Bunny.count_leg()結果:
靜態方法
靜態方法既不能用訪問成員,也不能訪問類成員。
- 啥是靜態方法?什么時候用靜態方法?
如果有一個方法,不把它放在類中,單獨存在也可以解決我們的問題。但是,為了滿足面向對象的開發思想,我們必須把它放在類中,這時,這個方法就是靜態方法。
- 語法
定義靜態方法:
@staticmethod def 方法名稱(參數列表):方法體調用靜態方法:
類名.方法名(參數列表)- 例子
代碼:
class Bunny:def __init__(self, name, age):self.name = nameself.age = age@staticmethoddef my_method():print("保護環境")Bunny.my_method()結果:
 
總結
以上是生活随笔為你收集整理的python面向对象(part1)--类和对象的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 禀告的近义词是什么
- 下一篇: python面向对象(part2)--封
