類屬性
- 類屬性就是給類對(duì)象中定義的屬性,通常用來(lái)記錄與這個(gè)類相關(guān)的特征
- 類屬性不會(huì)記錄具體對(duì)象的特征
屬性的獲取機(jī)制
- 在Python中屬性的獲取存在一個(gè)向上查找機(jī)制。因此,要訪問(wèn)類屬性有兩種方式:(類名、類屬性),(對(duì)象、類屬性)
- 向上查找機(jī)制:獲取對(duì)象屬性時(shí),首先在對(duì)象內(nèi)部查找對(duì)象屬性,沒(méi)有找到就會(huì)向上尋找類屬性
- 如果使用
對(duì)象.類屬性 = 值賦值語(yǔ)句,只會(huì)給對(duì)象添加一個(gè)屬性,而不會(huì)影響到類屬性的值
類方法
- 類方法就是針對(duì)類對(duì)象定義的方法,在類方法內(nèi)部可以直接訪問(wèn)類屬性或調(diào)用其他的類方法
語(yǔ)法
@classmethod
def 類方法名(cls):
pass
- 類方法需要使用修飾器
@classmethod來(lái)標(biāo)識(shí),告訴解釋器這是一個(gè)類方法。
- 類方法第一個(gè)參數(shù)應(yīng)該是
cls。由哪個(gè)類調(diào)用的方法,方法內(nèi)的cls就是哪一個(gè)類的引用。
- 類方法參數(shù)和self類似,通過(guò)
類名.調(diào)用類方法,調(diào)用方法時(shí),不需要傳遞cls參數(shù)。在方法內(nèi)部可以通過(guò)cls.訪問(wèn)類的屬性,也可以通過(guò)cls.調(diào)用其他的類方法
擴(kuò)展
靜態(tài)方法
- 當(dāng) 類中某個(gè)方法即不需要訪問(wèn)實(shí)例屬性或者調(diào)用實(shí)例方法也不需要訪問(wèn)類屬性,或者調(diào)用類方法的時(shí)候可以把這個(gè)方法封裝成一個(gè)靜態(tài)方法
- 靜態(tài)方法需要用修飾器
@staticmethod來(lái)標(biāo)識(shí),告訴解釋器這是一個(gè)靜態(tài)的方法。通過(guò)類名.調(diào)用靜態(tài)方法
語(yǔ)法
@staticmethod
def 靜態(tài)方法名():
pass
- 實(shí)例方法:由對(duì)象調(diào)用;至少一個(gè)self參數(shù);執(zhí)行實(shí)例方法時(shí),自動(dòng)調(diào)用該方法的對(duì)象賦值給self
- 類方法:由類調(diào)用;至少一個(gè)cls參數(shù);執(zhí)行類方法時(shí),自動(dòng)將調(diào)用該方法的類賦值給cls
- 靜態(tài)方法:由類調(diào)用,無(wú)默認(rèn)參數(shù)
- 相同點(diǎn):對(duì)于所有的方法而言,均屬于類,所以在內(nèi)存中也只保存一份
- 不同點(diǎn):方法調(diào)用者不同、調(diào)用方法時(shí)自動(dòng)傳入?yún)?shù)不同
單例
單例設(shè)計(jì)模式
- 目的:讓類創(chuàng)建的對(duì)象,在系統(tǒng)中只有唯一的一個(gè)實(shí)例,每一次執(zhí)行
類名()返回的對(duì)象,內(nèi)存地址是相同的
new方法
- 使用
類名()創(chuàng)建對(duì)象時(shí),Python會(huì)先調(diào)用new方法為對(duì)象分配空間
- 重寫(xiě)
__new__方法要return super().__new__(cls),否則Python的解釋器得不到分配空間的對(duì)象引用,就不會(huì)調(diào)用對(duì)象的初始化方法
作用
- 在內(nèi)存中為對(duì)象分配空間
- 返回對(duì)象的引用
實(shí)例
- 定義一個(gè)類屬性,初始值是None,用于記錄單例對(duì)象的引用
- 重寫(xiě)new方法
- 如果類屬性is None,調(diào)用父類方法分配空間,并在類屬性中記錄結(jié)果
- 返回類屬性中記錄的對(duì)象引用
class Singleton(object):
# 定義類屬性記錄單例對(duì)象引用
instance = None
def __new__(cls,*args,**kwargs):
# 1.判斷類屬性是否已經(jīng)被賦值
if cls.instance is None:
cls.instance = super().__new__(cls)
# 2.返回類屬性的單例引用
return cls.instance
- 定義一個(gè)類屬性init_flag標(biāo)記是否執(zhí)行過(guò)初始化動(dòng)作,初始值為False
- 在init方法中,判斷init_flag,如果為False就執(zhí)行初始化動(dòng)作
- 然后將init_flag設(shè)置為True
- 再次自動(dòng)調(diào)用init方法時(shí),初始化動(dòng)作就不會(huì)再次執(zhí)行
class Singleton(object):
# 記錄第一個(gè)被創(chuàng)建對(duì)象的引用
instance = None
# 記錄是否執(zhí)行過(guò)初始化操作
init_flag = False
def __new__(cls,*args,**kwargs):
# 1.判斷類屬性是否是空對(duì)象
if cls.instance in None:
# 2.調(diào)用父類的方法,為第一個(gè)對(duì)象分配空間
cls.instance = super().__new__(cls)
# 3.返回類屬性保存的對(duì)象引用
return cls.instance
def __init__(self):
if not Singleton.init_flag:
print("初始化單例")
Singleton.init_flag = True
# 創(chuàng)建多個(gè)對(duì)象
singleton1 = Singleton()
print(singleton1)
singleton2 = Singleton()
print(singleton2)
property屬性
定義
- 一種用起來(lái)像是使用的實(shí)例屬性一樣的特殊屬性。property屬性內(nèi)部進(jìn)行一系列的邏輯計(jì)算,最終將計(jì)算結(jié)果返回
注意
- 定義時(shí),在實(shí)例方法的基礎(chǔ)上添加@property裝飾器一個(gè),并且只有一個(gè)self參數(shù)
- 調(diào)用時(shí),無(wú)需括號(hào)
方法:foo_obj.func()
property屬性:foo_obj.prop
兩種方式
- 裝飾器:在方法上應(yīng)用裝飾器
- 類屬性:在類中定義值為property對(duì)象的類屬性
類屬性訪問(wèn)方式
三種類屬性訪問(wèn)方式
- @property:獲取
- @proerty.setter:修改
- @property.deleter:刪除
參數(shù)(property四個(gè)參數(shù))
- 第一個(gè)參數(shù):方法名,調(diào)用對(duì)象屬性時(shí),自動(dòng)觸發(fā)執(zhí)行方法
- 第二個(gè)參數(shù):方法名,調(diào)用對(duì)象屬性 = XXX時(shí),自動(dòng)觸發(fā)執(zhí)行方法
- 第三個(gè)參數(shù):方法名,調(diào)用del對(duì)象屬性時(shí),自動(dòng)觸發(fā)執(zhí)行方法
- 第三個(gè)參數(shù):字符串,調(diào)用對(duì)象屬性
.__doc__,此參數(shù)用來(lái)描述該屬性信息
魔法屬性
-
__init__:初始化方法,通過(guò)類創(chuàng)建對(duì)象時(shí),自動(dòng)觸發(fā)執(zhí)行
-
__doc__:表示類的描述信息`
-
__module__:表示當(dāng)前操作的對(duì)象在哪個(gè)模塊
-
__class__:表示當(dāng)前操作的對(duì)象的類是什么
-
__del__:當(dāng)對(duì)象在內(nèi)存中被釋放時(shí),自動(dòng)觸發(fā)執(zhí)行
-
__call__:對(duì)象后面加括號(hào),觸發(fā)執(zhí)行
-
__dict__:類或?qū)ο笾械乃袑傩裕惖膶?shí)例屬性屬于對(duì)象,類中的類屬性和方法屬于類)
-
__str__:如果一個(gè)類中定義了str方法,那么在打印對(duì)象時(shí),默認(rèn)輸出該方法的返回值
-
__getitem__、__setitem__、__delitem__:用于索引操作
-
__getslice__、__setslice__、__delslice__:用于切片操作
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。