最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中的魔術方法功能說明和典型示例

 更新時間:2025年12月01日 09:29:06   作者:Tallbo  
Python魔術方法是雙下劃線包圍的特殊方法(如__init__),用于讓自定義類支持運算符、內(nèi)置函數(shù)等高級特性,這篇文章主要介紹了Python中魔術方法功能說明和典型示例的相關資料,需要的朋友可以參考下

前言

在 Python 中,魔術方法(Magic Methods) 是一組以雙下劃線 __ 開頭和結尾的特殊方法(如 __init__、__str__),用于實現(xiàn)類的核心行為(如構造、運算、比較、屬性訪問等)。它們由 Python 解釋器自動調(diào)用,無需開發(fā)者顯式觸發(fā),是實現(xiàn)面向?qū)ο蟾呒壧匦裕ㄈ绲?、上下文管理器、運算符重載)的核心工具。

以下是 Python 中全部核心魔術方法的分類整理,涵蓋初始化、屬性訪問、運算重載、容器行為、迭代器、上下文管理等場景,并附帶功能說明和典型示例,幫助你系統(tǒng)理解其用法。

一、初始化與銷毀:對象的創(chuàng)建與回收

這類方法控制對象的創(chuàng)建、初始化和銷毀過程,是類最基礎的魔術方法。

魔術方法功能說明示例代碼
__new__(cls, *args, **kwargs)創(chuàng)建對象:在 __init__ 之前調(diào)用,返回類的實例(負責內(nèi)存分配),常用于不可變類型(如 int、str)的定制。python class Singleton: _instance = None def __new__(cls): if not cls._instance: cls._instance = super().__new__(cls) return cls._instance s1 = Singleton() s2 = Singleton() print(s1 is s2) # True(單例模式)
__init__(self, *args, **kwargs)初始化對象:對象創(chuàng)建后調(diào)用,用于初始化實例屬性(無返回值),是最常用的魔術方法。python class Person: def __init__(self, name, age): self.name = name self.age = age p = Person("Alice", 25) print(p.name) # Alice
__del__(self)銷毀對象:對象被垃圾回收時調(diào)用(時機不確定,不建議依賴),用于釋放資源(如文件句柄)。python class FileHandler: def __init__(self, path): self.file = open(path, "w") def __del__(self): self.file.close() # 回收時關閉文件

二、屬性訪問:控制實例屬性的讀寫

這類方法用于定制實例屬性的訪問、賦值、刪除邏輯,實現(xiàn)屬性的封裝、校驗或動態(tài)計算(如@property 的底層原理)。

魔術方法功能說明示例代碼
__getattr__(self, name)當訪問不存在的實例屬性時調(diào)用,返回屬性值或拋出 AttributeError。python class DynamicAttr: def __getattr__(self, name): if name == "full_name": return f"{self.first_name} {self.last_name}" raise AttributeError(f"No attribute {name}") d = DynamicAttr() d.first_name = "Bob" d.last_name = "Smith" print(d.full_name) # Bob Smith
__setattr__(self, name, value)給實例屬性賦值時調(diào)用(包括存在和不存在的屬性),可用于屬性校驗。python class Person: def __setattr__(self, name, value): if name == "age" and (not isinstance(value, int) or value < 0): raise ValueError("Age must be a non-negative integer") super().__setattr__(name, value) # 必須調(diào)用父類方法,避免遞歸 p = Person() p.age = 25 # 正常 p.age = -5 # 拋出 ValueError
__delattr__(self, name)刪除實例屬性del obj.name)時調(diào)用,可用于限制屬性刪除。python class ProtectedAttr: def __delattr__(self, name): if name == "id": raise PermissionError("Cannot delete 'id' attribute") super().__delattr__(name) p = ProtectedAttr() p.id = 123 del p.id # 拋出 PermissionError
__getattribute__(self, name)訪問任何實例屬性時都會優(yōu)先調(diào)用(包括存在的屬性),需謹慎使用(避免遞歸),常用于全局屬性控制。python class LogAttr: def __getattribute__(self, name): print(f"Accessing attribute: {name}") return super().__getattribute__(name) # 必須調(diào)用父類,避免遞歸 l = LogAttr() l.x = 10 print(l.x) # 先打印 "Accessing attribute: x",再輸出 10

三、字符串表示:定制對象的打印與轉(zhuǎn)換

這類方法控制對象在字符串場景下的表現(xiàn)(如 print(obj)、str(obj)、repr(obj)),幫助調(diào)試和用戶友好展示。

魔術方法功能說明示例代碼
__str__(self)當調(diào)用 str(obj)print(obj) 時調(diào)用,返回用戶友好的字符串(可讀性優(yōu)先)。python class Person: def __init__(self, name): self.name = name def __str__(self): return f"Person(name='{self.name}')" p = Person("Alice") print(p) # 輸出 Person(name='Alice')
__repr__(self)當調(diào)用 repr(obj) 或在交互式環(huán)境中直接輸入對象時調(diào)用,返回開發(fā)者友好的字符串(用于還原對象,唯一性優(yōu)先)。python class Person: def __init__(self, name): self.name = name def __repr__(self): return f"Person('{self.name}')" p = Person("Bob") print(repr(p)) # 輸出 Person('Bob') (可直接用于創(chuàng)建對象)
__format__(self, format_spec)當調(diào)用 format(obj, format_spec) 或使用 f-string 格式化時調(diào)用,定制格式化邏輯。python class Time: def __init__(self, h, m): self.h = h self.m = m def __format__(self, spec): if spec == "24h": return f"{self.h:02d}:{self.m:02d}" elif spec == "12h": period = "AM" if self.h < 12 else "PM" return f"{self.h%12:02d}:{self.m:02d} {period}" t = Time(15, 30) print(f"24h: {t:24h}") # 24h: 15:30 print(f"12h: {t:12h}") # 12h: 03:30 PM
__bytes__(self)當調(diào)用 bytes(obj) 時調(diào)用,返回對象的字節(jié)表示(bytes 類型)。python class Text: def __init__(self, content): self.content = content def __bytes__(self): return self.content.encode("utf-8") t = Text("Hello") print(bytes(t)) # b'Hello'

四、運算符重載:讓對象支持算術/比較運算

這類方法允許自定義類的實例支持 Python 內(nèi)置運算符(如 +>、==),是實現(xiàn)“對象運算”的核心。

4.1 算術運算符(+、-、*、/ 等)

魔術方法對應運算符功能說明示例(以 __add__ 為例)
__add__(self, other)+加法(self + other)python class Vector: def __init__(self, x): self.x = x def __add__(self, other): return Vector(self.x + other.x) v1 = Vector(2) v2 = Vector(3) print((v1 + v2).x) # 5
__sub__(self, other)-減法(self - other)-
__mul__(self, other)*乘法(self * other)-
__truediv__(self, other)/真除法(self / other)-
__floordiv__(self, other)//地板除法(self // other)-
__mod__(self, other)%取模(self % other)-
__pow__(self, other)**冪運算(self ** other)-

注:反向算術運算符(如 other + self,當 other 不支持與 self 運算時調(diào)用):__radd__、__rsub__、__rmul__ 等,用法與正向類似。

4.2 比較運算符(==、>、< 等)

魔術方法對應運算符功能說明示例(以 __eq__ 和 __gt__ 為例)
__eq__(self, other)==等于(self == other)python class Person: def __init__(self, id): self.id = id def __eq__(self, other): return self.id == other.id p1 = Person(1) p2 = Person(1) print(p1 == p2) # True
__ne__(self, other)!=不等于(self != other)(若未定義,默認返回 not __eq__ 的結果)
__gt__(self, other)>大于(self > other)python class Number: def __init__(self, n): self.n = n def __gt__(self, other): return self.n > other.n num1 = Number(5) num2 = Number(3) print(num1 > num2) # True
__ge__(self, other)>=大于等于-
__lt__(self, other)<小于-
__le__(self, other)<=小于等于-

4.3 賦值運算符(+=、-=、*= 等)

魔術方法對應運算符功能說明示例(以 __iadd__ 為例)
__iadd__(self, other)+=增量加法(self += other)python class Counter: def __init__(self, num): self.num = num def __iadd__(self, other): self.num += other return self c = Counter(10) c += 5 print(c.num) # 15
__isub__(self, other)-=增量減法-
__imul__(self, other)*=增量乘法-
__itruediv__(self, other)/=增量真除法-

4.4 位運算符(&、|、^、<<、>> 等)

魔術方法對應運算符功能說明
__and__(self, other)&按位與
__or__(self, other)``
__xor__(self, other)^按位異或
__lshift__(self, other)<<左移
__rshift__(self, other)>>右移

五、容器行為:讓對象像列表/字典一樣工作

這類方法允許自定義類的實例支持容器操作(如 len(obj)、obj[key]、for item in obj),實現(xiàn)類似列表、字典的行為。

魔術方法對應操作功能說明示例(實現(xiàn)一個簡單列表)
__len__(self)len(obj)返回容器的元素個數(shù)(必須返回整數(shù))。python class MyList: def __init__(self, data): self.data = data def __len__(self): return len(self.data) ml = MyList([1,2,3]) print(len(ml)) # 3
__getitem__(self, key)obj[key]獲取容器中 key 對應的元素(支持索引、切片),無對應 key 時拋 KeyError。python class MyList: def __init__(self, data): self.data = data def __getitem__(self, key): return self.data[key] ml = MyList([1,2,3]) print(ml[1]) # 2 print(ml[1:]) # [2,3]
__setitem__(self, key, value)obj[key] = value給容器中 key 對應的元素賦值,無對應 key 時可新增。python class MyList: def __init__(self, data): self.data = data def __setitem__(self, key, value): self.data[key] = value ml = MyList([1,2,3]) ml[1] = 10 print(ml.data) # [1,10,3]
__delitem__(self, key)del obj[key]刪除容器中 key 對應的元素,無對應 key 時拋 KeyError。python class MyList: def __init__(self, data): self.data = data def __delitem__(self, key): del self.data[key] ml = MyList([1,2,3]) del ml[1] print(ml.data) # [1,3]
__contains__(self, item)item in obj / item not in obj判斷 item 是否在容器中,返回布爾值(未定義則默認遍歷判斷)。python class MyList: def __init__(self, data): self.data = data def __contains__(self, item): return item in self.data ml = MyList([1,2,3]) print(2 in ml) # True print(4 in ml) # False
__iter__(self)for item in obj返回一個迭代器(用于遍歷容器),通常與 yield 配合或返回 iter(self.data)。python class MyList: def __init__(self, data): self.data = data def __iter__(self): for item in self.data: yield item # 生成迭代器 ml = MyList([1,2,3]) for num in ml: print(num) # 1, 2, 3
__reversed__(self)reversed(obj)返回容器的反向迭代器(用于 reversed(obj))。python class MyList: def __init__(self, data): self.data = data def __reversed__(self): return reversed(self.data) ml = MyList([1,2,3]) print(list(reversed(ml))) # [3,2,1]

六、迭代器與生成器:控制迭代過程

迭代器的核心是 __iter____next__ 方法,生成器則是通過 yield 簡化迭代器實現(xiàn),但魔術方法仍可定制生成器行為。

魔術方法功能說明示例(實現(xiàn)一個自定義迭代器)
__iter__(self)返回迭代器對象本身(必須實現(xiàn),用于 for 循環(huán))。python class Counter: def __init__(self, max_num): self.max = max_num self.current = 0 def __iter__(self): return self # 返回自身作為迭代器 def __next__(self): if self.current < self.max: self.current += 1 return self.current else: raise StopIteration # 迭代結束 c = Counter(3) for num in c: print(num) # 1, 2, 3
__next__(self)返回下一個迭代元素,無元素時拋 StopIteration(迭代器核心)。-
__send__(self, value)向生成器發(fā)送值(用于 yield 表達式接收外部值),生成器專用。python def generator(): while True: x = yield # 接收外部發(fā)送的值 print(f"Received: {x}") g = generator() next(g) # 啟動生成器 g.send(10) # 輸出 "Received: 10" g.send(20) # 輸出 "Received: 20"
__close__(self)關閉生成器(調(diào)用后生成器無法再生成值,拋 GeneratorExit)。python def generator(): yield 1 yield 2 g = generator() print(next(g)) # 1 g.close() next(g) # 拋 StopIteration

七、上下文管理:實現(xiàn)with語句支持

通過 __enter____exit__ 方法,讓對象支持 with 語句(自動管理資源,如文件關閉、鎖釋放)。

魔術方法功能說明示例(實現(xiàn)一個自定義文件管理器)
__enter__(self)進入 with 塊時調(diào)用,返回的對象可賦值給 as 后的變量(如 with open(...) as f)。python class MyFile: def __init__(self, path, mode): self.path = path self.mode = mode def __enter__(self): self.file = open(self.path, self.mode) return self.file # 賦值給 as 后的變量 def __exit__(self, exc_type, exc_val, exc_tb): self.file.close() # 退出 with 塊時自動關閉 # 使用 with MyFile("test.txt", "w") as f: f.write("Hello") # 文件已自動關閉
__exit__(self, exc_type, exc_val, exc_tb)退出 with 塊時調(diào)用,處理異常(若有):
- exc_type:異常類型(無異常則為 None
- exc_val:異常實例
- exc_tb:異常追蹤棧
返回 True 表示異常已處理,不向外傳播。
python class SafeFile: def __init__(self, path): self.path = path def __enter__(self): self.file = open(self.path, "w") return self.file def __exit__(self, exc_type, exc_val, exc_tb): self.file.close() if exc_type is not None: print(f"Error: {exc_val}") return True # 處理異常,不向外傳播 # 測試異常 with SafeFile("test.txt") as f: f.write(123) # 拋出 TypeError # 輸出 "Error: write() argument must be str, not int",無崩潰

八、其他常用魔術方法

8.1 可調(diào)用對象:讓實例像函數(shù)一樣調(diào)用

通過 __call__ 方法,讓類的實例支持函數(shù)調(diào)用語法(obj())。

魔術方法功能說明示例代碼
__call__(self, *args, **kwargs)實例被調(diào)用時執(zhí)行(obj(*args)),可實現(xiàn)“函數(shù)對象”或“狀態(tài)保持的函數(shù)”。python class Adder: def __init__(self, base): self.base = base def __call__(self, x): return self.base + x add5 = Adder(5) print(add5(3)) # 8(等價于 Adder(5)(3))

8.2 哈希與可哈希性

__hash__ 用于計算對象的哈希值(支持作為字典鍵、集合元素),__eq____hash__ 需滿足:若 a == b,則 hash(a) == hash(b)。

魔術方法功能說明示例代碼
__hash__(self)返回對象的哈希值(整數(shù)),未定義則默認基于內(nèi)存地址。python class Point: def __init__(self, x, y): self.x = x self.y = y def __eq__(self, other): return (self.x, self.y) == (other.x, other.y) def __hash__(self): return hash((self.x, self.y)) # 基于屬性哈希 p1 = Point(1,2) p2 = Point(1,2) print(hash(p1) == hash(p2)) # True d = {p1: "A"} print(d[p2]) # A(可作為字典鍵)

8.3 類型轉(zhuǎn)換

這類方法用于將對象轉(zhuǎn)換為其他內(nèi)置類型(如 int(obj)、bool(obj))。

魔術方法對應函數(shù)功能說明示例代碼
__int__(self)int(obj)轉(zhuǎn)換為整數(shù)python class Number: def __init__(self, n): self.n = n def __int__(self): return int(self.n) num = Number(3.8) print(int(num)) # 3
__float__(self)float(obj)轉(zhuǎn)換為浮點數(shù)-
__bool__(self)bool(obj)轉(zhuǎn)換為布爾值(if obj 時調(diào)用),未定義則默認:空容器/0 為 False,否則 True。python class EmptyCheck: def __init__(self, data): self.data = data def __bool__(self): return len(self.data) > 0 ec = EmptyCheck([]) print(bool(ec)) # False ec2 = EmptyCheck([1]) print(bool(ec2)) # True

總結

魔術方法是 Python 面向?qū)ο蟮?ldquo;靈魂”,其核心價值在于:

  1. 統(tǒng)一接口:讓自定義類的行為與內(nèi)置類型(如列表、字典)保持一致(如 len(obj)for item in obj);
  2. 靈活定制:通過重載運算符、屬性訪問、迭代邏輯等,實現(xiàn)高度定制化的類(如單例、自定義容器、上下文管理器);
  3. 隱式調(diào)用:無需顯式調(diào)用,由 Python 解釋器自動觸發(fā),簡化代碼。

實際開發(fā)中,無需記憶所有魔術方法,而是根據(jù)需求選擇(如實現(xiàn) with__enter__/__exit__,實現(xiàn)迭代用 __iter__/__next__),并遵循“最小必要”原則——僅實現(xiàn)需要的魔術方法,避免過度復雜。

到此這篇關于Python中魔術方法功能的文章就介紹到這了,更多相關Python魔術方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python批量處理URL并提取內(nèi)容且按序保存到本地

    python批量處理URL并提取內(nèi)容且按序保存到本地

    這篇文章主要為大家詳細介紹了如何使用python實現(xiàn)批量處理URL并提取內(nèi)容且按序保存到本地,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下
    2025-07-07
  • Pandas拼接concat使用方法

    Pandas拼接concat使用方法

    當我們需要將兩個Pandas DataFrame對象合并為一個時,就需要使用Pandas拼接函數(shù),本文主要介紹了Pandas拼接concat使用方法,感興趣的可以了解一下
    2023-12-12
  • python中不同數(shù)據(jù)對象的空值校驗總結

    python中不同數(shù)據(jù)對象的空值校驗總結

    在Python中,我們可以使用不同的方式來校驗數(shù)值的空值、字符串的空值以及對象的空值,本文為大家整理了一些常見的方法,希望對大家有所幫助
    2024-01-01
  • 使用Pytorch來擬合函數(shù)方式

    使用Pytorch來擬合函數(shù)方式

    今天小編就為大家分享一篇使用Pytorch來擬合函數(shù)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • 3行Python代碼實現(xiàn)剪輯音樂

    3行Python代碼實現(xiàn)剪輯音樂

    你以為剪輯音樂要很久嗎?其余3行語句Python就能瞬間搞定。本文就來詳細為大家講講實現(xiàn)的步驟,文中的示例代碼講解詳細,感興趣的可以動手嘗試一下
    2022-06-06
  • Python操控mysql批量插入數(shù)據(jù)的實現(xiàn)方法

    Python操控mysql批量插入數(shù)據(jù)的實現(xiàn)方法

    這篇文章主要介紹了Python操控mysql批量插入數(shù)據(jù)的實現(xiàn)方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • 8個Python中可復用函數(shù)的最佳實踐分享

    8個Python中可復用函數(shù)的最佳實踐分享

    在Python編程中,編寫可復用的函數(shù)是提高代碼質(zhì)量和開發(fā)效率的關鍵,本文將介紹8種最佳實踐,并提供豐富的示例代碼,希望可以幫助大家編寫高質(zhì)量的可復用函數(shù)
    2023-12-12
  • Python zip函數(shù)打包元素實例解析

    Python zip函數(shù)打包元素實例解析

    這篇文章主要介紹了Python zip函數(shù)打包元素實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • Django Highcharts制作圖表

    Django Highcharts制作圖表

    Highcharts圖表控件是目前使用最為廣泛的圖表控件 ,是純JS圖表庫。這篇文章主要介紹了Django Highcharts制作圖表的相關資料,非常的詳細,有需要的小伙伴可以來參考下
    2016-08-08
  • Python詳解文字轉(zhuǎn)語音的實現(xiàn)

    Python詳解文字轉(zhuǎn)語音的實現(xiàn)

    在自然語言處理上,文字、音頻互轉(zhuǎn)是一個很關鍵的技術點。對于語音轉(zhuǎn)文字,個人實現(xiàn)較為困難,我們可以使用語音轉(zhuǎn)文字的軟件或借助各API(如科大訊飛等)進行移植開發(fā)。不過文字轉(zhuǎn)語音就相對而言容易實現(xiàn)很多了
    2022-02-02

最新評論

天柱县| 公主岭市| 新丰县| 手游| 策勒县| 沙湾县| 万荣县| 天长市| 青岛市| 济宁市| 乐业县| 平昌县| 南川市| 宝坻区| 山丹县| 景洪市| 宜黄县| 土默特左旗| 青川县| 龙口市| 巍山| 澄江县| 同仁县| 石棉县| 铜鼓县| 松原市| 钟山县| 区。| 仁怀市| 瑞金市| 双江| 新干县| 隆尧县| 灵山县| 韶关市| 加查县| 新邵县| 鄯善县| 海淀区| 朝阳区| 饶河县|