09-Python之路-進(jìn)階-面向?qū)ο?類與方法

類屬性

  • 類屬性就是給類對(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í)例

  1. 定義一個(gè)類屬性,初始值是None,用于記錄單例對(duì)象的引用
  2. 重寫(xiě)new方法
  3. 如果類屬性is None,調(diào)用父類方法分配空間,并在類屬性中記錄結(jié)果
  4. 返回類屬性中記錄的對(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
        
  1. 定義一個(gè)類屬性init_flag標(biāo)記是否執(zhí)行過(guò)初始化動(dòng)作,初始值為False
  2. init方法中,判斷init_flag,如果為False就執(zhí)行初始化動(dòng)作
  3. 然后將init_flag設(shè)置為True
  4. 再次自動(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容