1.單例模式
概念定義:
????????單例模式(Singleton Pattern)是一種創建型設計模式,它確保一個類只能有一個實例,并提供一個全局訪問點來獲取該實例。這種模式在需要控制資源訪問、配置管理或協調系統操作時特別有用。
核心特點:
- 私有構造函數:防止外部通過new創建實例
- 靜態私有成員變量:保存類的唯一實例
- 靜態公有方法:提供獲取實例的全局訪問點,通常命名為getInstance()
實現方式:
1.實例方法:
class Person(object):name = '三笠' # 類屬性:類所擁有的屬性def __init__(self):self.age = 18 # 實例屬性:對象私有的def play(self): # 實例方法# 在實例方法中訪問類屬性print(f'{Person.name}在玩游戲')print(self.age)
li = Person()
li.play()
2.靜態方法:
class Person(object):name = '三笠' # 類屬性:類所擁有的屬性def __init__(self):self.age = 18 # 實例屬性:對象私有的@staticmethod # 靜態方法:類中的函數,形參沒有限制def introduce():print(f'我是{Person.name}') # 靜態方法能夠訪問到類屬性,但是沒意義pass
li = Person()
li.introduce()
3.類方法:
class Person(object):name = '三笠' # 類屬性:類所擁有的屬性def __init__(self):self.age = 18 # 實例屬性:對象私有的@classmethod # 類方法:針對類存在的方法def introduce(cls): # cls代表類對象本身print(cls.name)print()
li = Person()
li.introduce()
優缺點分析:
優點:
- 嚴格控制實例數量,節省系統資源
- 提供全局訪問點,方便管理共享資源
- 避免頻繁創建和銷毀對象,提高性能
缺點:
- 違反單一職責原則,既負責業務邏輯又控制實例創建
- 過度使用會導致代碼耦合度高
- 難以進行單元測試,因為全局狀態難以隔離
- 在多線程環境下需要特殊處理才能保證線程安全
總結:
????????類屬性是公共的,它被定義在類層面而非實例層面,所有類的實例都可以共享訪問這個屬性。例如,在一個Student類中定義class_name="高三一班"作為類屬性,那么所有Student的實例都能訪問到這個班級名稱。類屬性可以通過類名直接訪問(如Student.class_name),也可以通過實例訪問(如student1.class_name)。所有類的實例方法、靜態方法和類方法都能訪問到這個屬性。
????????靜態方法不需要訪問類屬性,因為靜態方法和類、對象沒有關聯,它更像是一個獨立于類的普通函數。靜態方法使用@staticmethod裝飾器定義,不會自動接收cls或self參數。例如,在MathUtils類中定義一個靜態方法add(a,b)來計算兩個數的和,這個方法不需要知道任何關于MathUtils類的信息就能正常工作。靜態方法通常用于實現與類相關但不需要訪問類狀態的功能。
????????實例屬性是私有的,它只能在特定實例的方法內部被訪問到。實例屬性通常在__init__方法中初始化,每個實例都擁有自己的屬性副本。例如,student1.name="張三"和student2.name="李四"就是兩個不同的實例屬性。只有實例方法(第一個參數為self的方法)能夠訪問這些屬性,因為這些方法需要通過self參數才能引用到具體的實例屬性。類方法和靜態方法都無法直接訪問實例屬性,因為它們沒有self參數來引用具體的實例。
2.魔法方法&魔法屬性
1.什么是魔法方法:
????????魔法方法(Magic Methods)是 Python 中一類特殊的方法,其名稱以雙下劃線開頭和結尾(如
__init__
、__str__
)。這些方法會在特定的情況下被 Python 自動調用,用于實現對象的特定行為或操作。
2.常見的魔法方法:
以下是一些常用的魔法方法及其用途:
__init__(self, ...)
:對象的初始化方法,在創建實例時自動調用。__str__(self)
:定義對象的字符串表示形式,通常用于print()
或str()
調用。__repr__(self)
:定義對象的官方字符串表示形式,用于調試或repr()
調用。__len__(self)
:定義對象的長度,適用于len()
調用。__add__(self, other)
:定義對象的加法操作,如obj1 + obj2
。__eq__(self, other)
:定義對象的相等性比較,如obj1 == obj2
。__getitem__(self, key)
:定義對象的索引訪問,如obj[key]
。__setitem__(self, key, value)
:定義對象的索引賦值,如obj[key] = value
。__delitem__(self, key)
:定義對象的索引刪除,如del obj[key]
。__iter__(self)
:定義對象的迭代行為,用于for
循環。__next__(self)
:定義迭代器的下一個值。__call__(self, ...)
:允許對象像函數一樣被調用,如obj()
。
3. 魔法屬性的說明
????????魔法屬性(Magic Attributes)是 Python 中一些特殊的屬性,通常用于獲取對象的元信息或控制對象的行為。常見的魔法屬性包括:
__dict__
:存儲對象的屬性字典。__class__
:返回對象所屬的類。__doc__
:獲取對象的文檔字符串(即"""..."""
的內容)。__name__
:獲取類或函數的名稱。__module__
:獲取對象所屬的模塊名稱。
4. 實際應用示例
以下是一個使用魔法方法的示例,定義一個簡單的自定義列表類:
class MyList:def __init__(self, data=None):if data is None:self.data = []else:self.data = list(data)def __str__(self):return f"MyList: {self.data}"def __len__(self):return len(self.data)def __getitem__(self, index):return self.data[index]def __setitem__(self, index, value):self.data[index] = valuedef __iter__(self):return iter(self.data)# 使用示例
my_list = MyList([1, 2, 3])
print(my_list) # 輸出: MyList: [1, 2, 3]
print(len(my_list)) # 輸出: 3
print(my_list[1]) # 輸出: 2
my_list[1] = 99
print(my_list) # 輸出: MyList: [1, 99, 3]for item in my_list:print(item) # 輸出: 1, 99, 3
5. 魔法方法的注意事項
- 魔法方法通常由 Python 解釋器自動調用,不建議直接調用(如
obj.__init__()
)。- 魔法方法可以重寫以定制對象的行為,但需確保不破壞其預期功能。
- 合理使用魔法方法可以讓自定義類更自然地融入 Python 的生態系統。