Python魔法函數(Magic Methods簡介

在 Python 中,魔法函數(Magic Methods)也稱為雙下劃線方法(Dunder Methods),是指那些名字以雙下劃線開頭和結尾的特殊方法。 這些方法可以讓您的自定義類實現一些特定的行為,從而與 Python 的內置類型和操作進行交互。

例如,`__init__` 方法用于對象的初始化,`__str__` 方法用于定義對象的字符串表示形式,`__add__` 方法用于實現對象的加法操作等。

以下是一些常見魔法函數的示例及其作用:

1. `__init__`:在創建對象時自動調用,用于初始化對象的屬性。?

class MyClass:def __init__(self, value):self.value = value

?例子:創建“Student”類,對應邏輯關系:

Student→self→{name,age,grade}(三個邏輯分支)

# 創建學生對象
student1 = Student("Alice", 12, 6)
#類的實例化
class Student:def __init__(self, name, age, grade):self.name = nameself.age = ageself.grade = grade# 創建學生對象
student1 = Student("Alice", 12, 6)
print(student1.name)  
print(student1.age)  
print(student1.grade)  

?

2. `__str__`:定義對象的字符串表示,當使用 `str()` 函數或在打印對象時調用。

class MyClass:def __str__(self):return f"MyClass with value: {self.value}"

例子:

class MyClass:def __init__(self, value):self.value = valuedef __str__(self):return f"My value is {self.value}"my_object = MyClass(42)
print(str(my_object))  

在這段代碼中,`42` 這個值的傳遞關系如下: 當創建對象 `my_object = MyClass(42)` 時,`42` 作為參數被傳遞給了 `MyClass` 類的 `__init__` 方法。 在 `__init__` 方法內部,`42` 被賦值給了對象的 `self.value` 屬性,使得該對象具有了 `value` 屬性且其值為 `42` 。 當執行 `str(my_object)` 或 `print(my_object)` 時,會調用 `__str__` 方法,在 `__str__` 方法中通過 `self.value` 訪問到了之前存儲的 `42` 值,并將其用于生成返回的字符串 `My value is 42` 。 簡單來說,`42` 從創建對象時作為參數傳入,被存儲在對象的屬性中,然后在需要時被 `__str__` 方法獲取并使用。 ?

3. `__add__`:實現對象的加法操作。

class MyNumber:def __init__(self, num):self.num = numdef __add__(self, other):return MyNumber(self.num + other.num)

例子:

class MyNumber:def __init__(self, num):self.num = numdef __add__(self, other):return MyNumber(self.num + other.num)num1 = MyNumber(5)
num2 = MyNumber(3)
result = num1 + num2
print(result.num)  

?

4. `__len__`:用于 `len()` 函數獲取對象的長度。

class MyList:def __init__(self, items):self.items = itemsdef __len__(self):return len(self.items)

例子:

class MyList:def __init__(self, items):self.items = itemsdef __len__(self):return len(self.items)my_list = MyList([1, 2, 3, 4, 5])
print(len(my_list))  

通過合理地定義魔法函數,可以使自定義類的行為更加自然和符合 Python 的習慣用法。

以下是一些常見的 Python 魔法函數及它們的作用:

1. `__init__(self,...)`:對象初始化函數,在創建對象時調用,用于進行對象的初始化操作。

2. `__str__(self)`:直接打印對象的實現方法,被`print`函數調用,返回對象的字符串表示。

3. `__new__(cls, *args, **kwargs)`:在對象實例化時首先被調用,用于創建并返回實例對象。

4. `__unicode__(self)`:在一個對象上調用`unicode()`時被調用,常用于 Django 模型中處理字符串。

5. `__call__(self, *args, **kwargs)`:允許一個類的實例像函數一樣被調用。

6. `__len__(self)`:定義當被`len()`調用時的行為,需要返回一個整數,表示對象的長度。

7. `__repr__(self)`:用于將值轉化為供解釋器讀取的形式,如果對象沒有適于人閱讀的解釋形式,`str()`會返回與`repr()`相同的內容。

8. `__setattr__(self, name, value)`:可以設置對象的屬性。

9. `__getattr__(self, name)`:獲取對象屬性,在屬性沒有找到時被調用。

10. `__getattribute__(self, name)`:無條件地獲取對象屬性,可用于做一些控制,但定義后`__getattr__`不再自動調用,除非顯式調用。

11. `__delattr__(self, name)`:用于刪除對象的屬性。

12. `__setitem__(self, key, value)`:實現該函數后,可以以下標的方式給對象賦值。

13. `__getitem__(self, key)`:可以使對象支持以下標的方式獲取值。

14. `__delitem__(self, key)`:支持以下標方式刪除對象數據。

15. `__iter__(self)`:只要定義了該方法,對象就可以使用迭代器訪問,意味著可以迭代自定義的對象。

16. `__del__(self)`:析構器或回收器,在對象引用數降到 0 時執行,但執行時間可能不確定,一般不推薦使用,可用于實現一些非緊急但必須要做的事。

17. `__eq__(self, other)`:定義等于號的行為,用于判斷兩個對象是否相等。

18. `__lt__(self, other)`:定義小于號的行為,用于判斷一個對象是否小于另一個對象。

19. `__gt__(self, other)`:定義大于號的行為,用于判斷一個對象是否大于另一個對象。

20. `__add__(self, other)`:定義加法操作的行為。

21. `__sub__(self, other)`:定義減法操作的行為。

22. `__mul__(self, other)`:定義乘法操作的行為。

23. `__truediv__(self, other)`:定義真除法操作的行為。

24. `__floordiv__(self, other)`:定義整數除法操作的行為。

25. `__mod__(self, other)`:定義取模算法的行為。

26. `__pow__(self, other, modulo)`:定義當被`power()`調用或 `**` 運算時的行為。

27. `__radd__(self, other)`等(反運算魔法方法):當左操作數不支持相應的操作時被調用,例如`__radd__`在執行`other + self`時被調用。

28. `__iadd__(self, other)`等(增量賦值運算魔法方法):定義相應的增量賦值運算行為,如`__iadd__`定義`+=`的行為。

29. `__neg__(self)`:定義正號的行為。

30. `__pos__(self)`:定義負號的行為。

31. `__abs__(self)`:定義當被`abs()`調用時的行為。

32. `__invert__(self)`:定義按位求反的行為。

33. `__complex__(self)`:定義當被`complex()`調用時的行為,需要返回恰當的值。

34. `__int__(self)`:定義當被`int()`調用時的行為,需要返回恰當的值。

35. `__float__(self)`:定義當被`float()`調用時的行為,需要返回恰當的值。

36. `__round__(self, n)`:定義當被`round()`調用時的行為,需要返回恰當的值。

37. `__index__(self)`:當對象應用在切片表達式中時,實現強制轉換;如果定義了該方法,則也需要定義`__int__`且返回相同的值。

魔法函數可以讓自定義類具有更豐富的行為,類似于 Python 內置類型的操作方式,從而使代碼更加簡潔、易讀和可維護。它們的具體使用方式和效果取決于具體的需求和上下文。在實際編程中,根據需要選擇合適的魔法函數來定制類的行為。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42427.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42427.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42427.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

絕區肆--2024 年AI安全狀況

前言 隨著人工智能系統變得越來越強大和普及,與之相關的安全問題也越來越多。讓我們來看看 2024 年人工智能安全的現狀——評估威脅、分析漏洞、審查有前景的防御策略,并推測這一關鍵領域的未來可能如何。 主要的人工智能安全威脅 人工智能系統和應用程…

Qt 繪圖詳解

文章目錄 頭文件和構造函數啟用反鋸齒功能繪制矩形繪制圓角矩形繪制橢圓繪制圓弧繪制弦繪制凸多邊形繪制圖片繪制直線繪制多條直線繪制多點連接的線繪制路徑繪制扇形繪制點繪制文本擦除矩形區域填充矩形填充路徑 頭文件和構造函數 #include "mainwindow.h" #include…

C-11 三角剖分的調研

C-11 三角剖分算法 三角剖分就是將輸入的多邊形,分割成一系列互不重疊的三角形,其重要性就在這不多贅述。這個是一個別人總結的鏈接:http://vterrain.org/Implementation/Libs/triangulate.html 圖片鏈接:http://www-cgrl.cs.m…

基于CentOS Stream 9平臺搭建MinIO以及開機自啟

1. 官網 https://min.io/download?licenseagpl&platformlinux 1.1 下載二進制包 指定目錄下載 cd /opt/coisini/ wget https://dl.min.io/server/minio/release/linux-amd64/minio1.2 文件賦權 chmod x /opt/coisini/minio1.3 創建Minio存儲數據目錄: mkdi…

springboot校園安全通事件報告小程序-計算機畢業設計源碼02445

Springboot 校園安全通事件報告小程序系統 摘 要 隨著中國經濟的飛速增長,消費者的智能化水平不斷提高,許多智能手機和相關的軟件正在得到更多的關注和支持。其中,校園安全通事件報告小程序系統更是深得消費者的喜愛,它的出現極大…

關于隱藏、覆蓋(重寫)、重載的理解

定義區分 在派生-對象中:優先考慮隱藏,此時派生類中的覆蓋(重寫)也是隱藏;沒有隱藏的情況下,子類對象才能調用父類重載函數。[此時感覺virtual沒用,]在派生-指針或者引用中:只用覆蓋(重寫)和重載; 注:C Pr…

《Programming from the Ground Up》閱讀筆記:p19-p48

《Programming from the Ground Up》學習第2天,p19-p48總結,總計30頁。 一、技術總結 1.object file p20, An object file is code that is in the machine’s language, but has not been completely put together。 之前在很多地方都看到object fi…

高階K8S面試題你會幾個?

前言 K8S架構、公有云、持久化存儲、HELM、CICD、負載均衡、監控告警、可觀察性、服務治理、架構探索。。。 Q1:如何調試 Kubernetes 集群中的網絡連接問題,比如 Pod 間通信失敗的情況? 狀態檢查:使用 kubectl get pods 和 kube…

MySQL-17-mysql alter 語句如何實現?如何合并為一個

拓展閱讀 MySQL 00 View MySQL 01 Ruler mysql 日常開發規范 MySQL 02 truncate table 與 delete 清空表的區別和坑 MySQL 03 Expression 1 of ORDER BY clause is not in SELECT list,references column MySQL 04 EMOJI 表情與 UTF8MB4 的故事 MySQL 05 MySQL入門教程&a…

Git使用中遇到的問題(隨時更新)

問題1.先創建本地庫,后拉取遠程倉庫時上傳失敗的問題怎么解決? 操作主要步驟: step1 設置遠程倉庫地址: $ git remote add origin gitgitee.com:yourAccount/reponamexxx.git step2 推送到遠程倉庫: $ git push -u origin "master&qu…

線程池理解及7個參數

定義理解 線程池其實是一種池化的技術實現,池化技術的核心思想就是實現資源的復用,避免資源的重復創建和銷毀帶來的性能開銷。線程池可以管理一堆線程,讓線程執行完任務之后不進行銷毀,而是繼續去處理其它線程已經提交的任務。 …

GStreamer學習5----probe數據探測

參考資料: gstreamer中如何使用probe(探針)獲取幀數據_gstreamer 視頻編碼時獲取視頻關鍵幀信息-CSDN博客 Gstreamer中可以使用AppSink作為一個分支來查看管線中的數據,還可以使用probe去處理。 在GStreamer中,probe…

LayerNorm Plugin的使用與說明

目錄 前言0. 簡述1. Layernorm Plugin的使用1.1 源碼下載1.2 模型下載和修改1.3 環境配置1.4 編譯1.4 engine生成和執行(trtexec)1.5 enging生成和執行(C API) 2. 補充說明2.1 RTMO顯存占用問題2.2 插件找不到的說明2.3 LayerNorm plugin封裝的嘗試2.4 layerNorm plugin核函數實…

拉曼光譜入門:3.拉曼光譜的特征參數與定量定性分析策略

1.特征參數 1.1 退偏振率 退偏振率(p)是一個衡量拉曼散射光偏振狀態的參數,它描述了拉曼散射光的偏振方向與入射光偏振方向之間的關系。退偏振率定義為垂直偏振方向的拉曼散射強度與平行偏振方向的拉曼散射強度之比。退偏振率(p&…

禁用windows的語音識別快捷鍵win+ctrl+s

win11組合鍵winctrls會彈出語音識別提示,即使到設置里禁用了語音識別也沒用 解決辦法:安裝PowerToys,通過“鍵盤管理器”-“重新映射快捷鍵”禁用 PowerToys是微軟自己的工具,不用擔心安全問題,下載地址:h…

系統設計題-簡易數據庫系統

一、設計一個簡易數據庫系統,包含create,insert,select三個指令。 create(int tableId,int colNum,String key):創建表,其id為tableId,如果該表已存在,則不做任何處理。colNum為表中列的數量&a…

洛谷 P3008 [USACO11JAN] Roads and Planes G

題意 有一張 n n n 點 ( m 1 m 2 ) (m_1m_2) (m1?m2?) 邊的無向圖,其中 m 1 m_1 m1? 條為無向邊,另外 m 2 m_2 m2? 條為有向邊, 無向邊的邊權可以為負。求 s s s 到其他每個點的最短路。 思路 使用 SPFA 會 T 掉一兩個點&#x…

第10章:網絡與信息安全

目錄 第10章:網絡與信息安全 網絡概述 計算機網絡概念 計算機網絡的分類 網絡的拓撲結構 ISO/OSI網絡體系結構 網絡互聯硬件 物理層互聯設備 數據鏈路層互聯設備 網絡層互聯設備 應用層互聯設備 網絡的協議與標準 網絡標準 TCP/IP協議族 網絡接口層協…

GCC擴展功能、函數,預處理命令

文章目錄 前言一、GCC C語言擴展聲明函數屬性變量屬性內斂匯編與原子操作相關的內建函數內存模型感知原子操作的內置函數使用溢出檢查執行算術的內置函數 - xxx 二、GCC C語言擴展interface和 pragmasTemplate 二、預處理過程及其指令預處理過程1. 字符集轉換2. Initial proces…

實現基于Spring Cloud的事件驅動微服務

實現基于Spring Cloud的事件驅動微服務 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿! 事件驅動架構在現代微服務架構中越來越受歡迎,它通過事件的…