一文帶你深入理解Python魔法方法
一、構(gòu)造和初始化
__new__ 和 __init__ 是 Python 對象生命周期的開始。__new__ 方法是在一個對象實例化的時候所調(diào)用的第一個方法,在調(diào)用 __init__ 初始化前,先調(diào)用 __new__。
class MyClass:
def __new__(cls, *args, **kwargs):
print('Instance is created')
instance = super().__new__(cls)
return instance
def __init__(self, name):
print('Instance is initialized')
self.name = name
obj = MyClass('MyClass') # 輸出:Instance is created Instance is initialized二、字符串表示
__str__ 和 __repr__ 都是用于顯示的魔法方法。__str__ 是友好易讀的方式呈現(xiàn),而 __repr__ 是準(zhǔn)確、無歧義地表達出來,主要供開發(fā)和調(diào)試時使用。
class MyClass:
def __init__(self, name):
self.name = name
def __str__(self):
return f'Instance of MyClass with name {self.name}'
def __repr__(self):
return f'MyClass(name={self.name})'
obj = MyClass('MyClass')
print(str(obj)) # 輸出:Instance of MyClass with name MyClass
print(repr(obj)) # 輸出:MyClass(name=MyClass)三、算術(shù)運算符
魔法方法還可以用來定義對象的算術(shù)運算行為,例如 __add__、__sub__、__mul__ 等。
class Number:
def __init__(self, value):
self.value = value
def __add__(self, other):
return self.value + other.value
num1 = Number(1)
num2 = Number(2)
print(num1 + num2) # 輸出:3四、比較運算符
比較運算符的魔法方法包括 __lt__、__le__、__eq__、__ne__、__gt__、__ge__ 等。
class Number:
def __init__(self, value):
self.value = value
def __lt__(self, other):
return self.value < other.value
num1 = Number(1)
num2 = Number(2)
print(num1 < num2) # 輸出:True五、屬性訪問
當(dāng)我們試圖訪問一個對象的屬性時,__getattr__、__setattr__、__delattr__ 和 __getattribute__ 魔法方法就會被調(diào)用。__getattribute__ 方法是用于獲取一個屬性的值,而 __setattr__ 是在我們試圖設(shè)置一個屬性值時被調(diào)用。
class MyClass:
def __init__(self):
self.name = 'MyClass'
def __getattribute__(self, item):
if item == 'name':
print('Accessing name attribute')
return object.__getattribute__(self, item)
def __setattr__(self, key, value):
print(f'Setting attribute {key} with value {value}')
self.__dict__[key] = value
obj = MyClass()
print(obj.name) # 輸出:Accessing name attribute MyClass
obj.name = 'New name' # 輸出:Setting attribute name with value New name六、上下文管理器
上下文管理器是通過 __enter__ 和 __exit__ 魔法方法實現(xiàn)的,它們通常在 with 語句中使用。
class ManagedFile:
def __init__(self, filename):
self.filename = filename
def __enter__(self):
self.file = open(self.filename, 'r')
return self.file
def __exit__(self, exc_type, exc_val, exc_tb):
if self.file:
self.file.close()
with ManagedFile('hello.txt') as f:
content = f.read()
print(content)在這個例子中,__enter__ 方法打開文件并返回,__exit__ 方法在離開 with 塊時被調(diào)用,負(fù)責(zé)關(guān)閉文件。
七、結(jié)論
Python 的魔法方法為我們提供了改變對象行為的強大工具,讓我們能夠以符合 Python 風(fēng)格的方式去操作和處理對象。同時,理解并掌握這些魔法方法也是成為高級 Python 程序員的必經(jīng)之路。
到此這篇關(guān)于一文帶你深入理解Python魔法方法的文章就介紹到這了,更多相關(guān)Python魔法方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PyCharm Terminal終端命令行Shell設(shè)置方式
這篇文章主要介紹了PyCharm Terminal終端命令行Shell設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
PyQT5 QTableView顯示綁定數(shù)據(jù)的實例詳解
今天小編就為大家分享一篇PyQT5 QTableView顯示綁定數(shù)據(jù)的實例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06
Python實現(xiàn)常見坐標(biāo)系的相互轉(zhuǎn)換
WGS84坐標(biāo)系、GCJ02坐標(biāo)系、BD09坐標(biāo)系和Web?墨卡托投影坐標(biāo)系是我們常見的四個坐標(biāo)系。這篇文章為大家整理了這四個坐標(biāo)系之間相互轉(zhuǎn)換的方法,需要的可以參考一下2023-02-02
pycharm設(shè)置python文件模板信息過程圖解
這篇文章主要介紹了pycharm設(shè)置python文件模板信息過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03
解讀torch.cuda.amp自動混合精度訓(xùn)練之節(jié)省顯存并加快推理速度
這篇文章主要介紹了torch.cuda.amp自動混合精度訓(xùn)練之節(jié)省顯存并加快推理速度問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
用Python實現(xiàn)一個模仿UP主彈幕控制的直播間功能
up主通過代碼實現(xiàn)了實時讀取直播間里的彈幕內(nèi)容,進而控制自己的電腦,把彈幕翻譯成指令操控《賽博朋克2077》游戲,這篇文章主要介紹了用Python實現(xiàn)一個模仿UP主彈幕控制的直播間功能,需要的朋友可以參考下2021-12-12

