類的設計:
在程序開發中,要設計一個類,通常需要滿足以下三要求
1.類名 這類事物的名字,滿足大駝峯命名法
2.屬性 這類事物具有什麼樣的特徵
3.方法 這類事物具有什麼樣的行爲
面向對象的基礎語法:
定義簡單的類:
class 類名:
def 方法1(self,參數列表):
pass
def 方法2 (self,參數列表):
當一個類定義完成之後,要使用這個類來創建對象,語法格式如下:
對象變量 = 類名()
實例:
需求
小貓愛吃魚,小貓要喝水
一.面向對象三大方法
1.初始化方法
我們現在已經知道了使用類名()
當使用類名()創建對象時,python的解釋其會自動執行以下操作:
1.爲對性在內存中分配空間--創建對象
2.調用初始化方法爲對象的屬性設置初始值--初始化方法
__init__ 方法是專門用來定義一個類具有哪些屬性的方法
實例:
2.__del__方法
在python中
當使用類名()創建對象時,爲對象分配空間後,自動調用__init__
當一個對象被從內存中銷燬前,會自動調用__del__方法
實例:
3.__str__方法
在python中,使用pytjon輸出對象變量,
在默認情況下,會輸出這個變量引用的對象是由哪一個類創建的對象,以及在內存中
的地址(十六進制表示)
如果在開發中,希望使用print輸出對象變量時,
能夠打印自定義的額內容,就可以利用__str__這個內置方法了4
二.面向對象三大特徵:
1.封裝:根據職責將屬性和方法封裝到一個抽象的類中
2.繼承: 實現代碼的重用,相同的代碼不需要重複的寫
3.多態: 不同的對象調用相同的方法,產生不同的結果,
增加代碼的靈活度
1.封裝
1.封裝是面向對象變成的一大特點
2. 面向對象變成的第一部 將屬性和方法封裝到一個抽象的類中
3. 外界使用類創建對象,然後讓對象調用方法
4.對象方法的細節都被封裝在類的內部
實例一:
實例二:
1.房子有戶型,總面積和傢俱名稱列表
新房子沒有任何的傢俱
2.傢俱有名字和佔地面積,其中
牀:佔地4平米
衣櫃: 佔地2平米
參作: 佔地3平米
3.將以上三間傢俱添加到房中
4.打印房子時,要求輸出:戶型,總面積,剩餘面積,傢俱名稱列表
2.繼承:
實例一:
1.繼承的傳遞性:
1,B類傳承與A類,C類傳承與B類
2,那麼C類就具有B 類和A類所有的屬性和方法
子類擁有父類以及父類的父類所有封裝的屬性和方法
實例二:
2.覆蓋父類的方法
如果在開發中,父類的方法的實現和子類方法的實現,完全不同,就可以使用覆蓋的方法
在子類中重新編寫父類的方法
具體實現方式,就相當於在子類中定義了一個和父類同名的方法並且實現
重寫之後,在運行時,只會調用子類的重寫方法。而不會再調用父類封裝的方法
3.多繼承
多繼承
子類擁有一個父類叫做單繼承
子類可以擁有多個父類,並且具有多個父類的屬性和方法
例如:孩子會繼承自己父親母親的特性
語法:
class 子類名(父類名,父類名2...)
pass
3.多態
三.私有屬性和私有方法
應用成精及定義方式
應用場景
在實際開發中,對象的屬性或方法可能只希望自己能看
私有屬性就是對象不希望公開的屬性
私有方法就是對象不希望公開的方法
定義方法
在定義屬性或方法時,在屬性名或者方法前增加“__”
實例一:
實例二之父類私有方法屬性1:
1.子類對象不能在自己的方法內部,直接訪問父類的私有屬性和私有方法
2.子類對象可以通過父類的共有方法簡介訪問到私有屬性或私有方法
私有屬性,私有方法是對象的隱私,不對外公開,外界以及子類都不能直接訪問
私有屬性,私有方法常做一些內部的事情
四.類的結構
實例:
1.使用面向對象開發,第一部是設計類
2.使用雷鳴()創建對象,創建對象的動作有兩步
1.在內存中對象分配空間
2.調用初始化方法__init__爲對象初始化
3.對象創建後,內存中就有一個對象的實實在在的存在--實例
因此:
1.創建出來的對象叫做類的實例
2.創建對象的動作叫做實例化
3.對象的屬性叫做實例屬性
4.對象調用的方法叫做實例方法
在程序執行時:
1.對象各自擁有自己的實例屬性
2.調用對象的方法,可以通過self
父嗯文自己的屬性
調用自己的方法
結論:
1.每一個對象都有自己獨立的內存空間,保存各自不同的額屬性
2。多個對象的方法,在內存中只有一份,在調用方法時,需要把對象的引用傳遞到方法內部
1.類結構:
是一個特殊的對象
python中一切皆對象
class AAA: 定義的類屬性屬於類對象
obj1 = AAA: 屬於實例對象
在運行程序時,類同樣會被加載到內存
在python中,類是一個特殊的對象--類對象
除了封裝 實例(對象)的屬性和方法外,類對象還可以有自己的屬性和方法
通過類名. 的方式可以直接訪問類的屬性或者調用類的方法
2.類屬性
類屬性就是針對類對象定義的屬性
使用賦值語句在class關鍵字下方可以定義類屬性
類屬性用於記錄於這個類相關的特徵
類方法就是針對類對象定義的額方法
在類方法內部就可以直接訪問類屬性或者調用其他方法
語法如下
@classmethod
def 類方法(cls):
pass
靜態方法
在開發時,如果需要在類中封裝一個方法,這個方法:
既不需要訪問實例屬性或者調用實例方法
也不需要訪問類屬性或者調用類方法
這個時候可以把這個方法封裝成一個靜態方法
他語法如下:
@staticmethod
def 靜態方法():
pass
靜態方法需要修飾器@staticmethod來標識,告訴解釋器這是一個靜態方法
通過類名,調用靜態方法
綜合應用:
案例小結:
1.實例方法:方法內部需要訪問實例屬性
2.類方法:方法內部只需要訪問類屬性
3.靜態方法:方法內部不需要訪問實例屬性
提問:如果方法內部,既需要訪問實例屬性,有需要訪問類屬性,應該用什麼方法?
答: 應該用定義實例方法
"""
設計模式:
使用類名()創建對象時候,python的解釋器首先會調用__new__方法作爲對象分配空間
__new__是一個由object基類提供的額內之的靜態方法,主要有兩個作用:
在內存中爲對象分配空間
返回對象的引用
python的解釋器獲得額對象的引用後,將引用作爲第一個參數,傳遞給__init__方法
# __new__: 負責給對象分配空間 __init__(初始化方法)負責給對象初始化