Python 魔術或鄧德方法

Python 中的魔法方法是以雙下劃線開始和結束的特殊方法。它們也被稱為鄧德方法。魔法方法並不意味着由您直接調用,而是在某個動作上從類內部進行調用。例如,當您使用+運算符將兩個數字相加時,在內部將調用__add__()方法。

Python 中的內置類定義了許多神奇的方法。使用dir()函數查看一個類繼承的魔法方法數量。 例如,下面列出了在int類中定義的所有屬性和方法。

>>> dir(int)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']

正如您在上面看到的,int 類包含了各種由雙下劃線包圍的神奇方法。例如,__add__方法是一種神奇的方法,當我們使用+運算符將兩個數字相加時,它就會被調用。 考慮以下示例。 T3】

>>> num=10
>>> num + 5
15
>>> num.__add__(5)
15

可以看到,當你做num+10時,+運算符調用__add__(10)方法。 也可以直接打num.__add__(5)會給出同樣的結果。 然而,如前所述,魔法方法並不意味着被直接調用,而是在內部,通過一些其他的方法或動作。

在 Python 中,魔術方法最常用於定義預定義運算符的重載行為。例如,默認情況下,算術運算符對數字操作數進行運算。這意味着數值對象必須與+、-、*、/等運算符一起使用。+運算符也被定義為字符串、列表和元組類中的串聯運算符。我們可以說+運算符是重載的。

為了使重載行為在您自己的自定義類中可用,應該重寫相應的 magic 方法。例如,為了將+運算符用於用戶定義類的對象,它應該包括__add__()方法。

讓我們看看如何實現和使用一些重要的魔術方法。

new()方法

Java 和 C# 等語言使用新的運算符來創建類的新實例。在 Python 中,__new__()魔法方法在__init__()方法之前被隱式調用。__new__()方法返回一個新的對象,然後由__init__()初始化。

Example: new()

class Employee:
    def __new__(cls):
        print ("__new__ magic method is called")
        inst = object.__new__(cls)
                return inst
    def __init__(self):
        print ("__init__ magic method is called")
        self.name='Satya' 

當您創建Employee類的實例時,上面的示例將產生以下輸出。

>>> emp = Employee()
__new__ magic method is called
__init__ magic method is called

因此,在__init__()方法之前調用__new__()方法。

str()方法

另一個有用的魔法方法是__str__()。它被重寫以返回任何用戶定義類的可打印字符串表示形式。 我們已經看到str()內置函數從對象參數返回一個字符串。例如,str(12)返回‘12’。當被調用時,它調用 int 類中的__str__()方法。

>>> num=12
>>> str(num)
'12'
>>> #This is equivalent to
>>> int.__str__(num)
'12'

現在讓我們重寫 Employee 類中的__str__()方法,以返回其對象的字符串表示。

Example: str()

class Employee:
    def __init__(self):
        self.name='Swati'
        self.salary=10000
    def __str__(self):
        return 'name='+self.name+' salary=$'+str(self.salary) 

查看str()函數如何在內部調用員工類中定義的__str__()方法。這就是為什麼它被稱為神奇的方法!

>>> e1=Employee()
>>> print(e1)
name=Swati salary=$10000

add()方法

在下面的示例中,一個名為 distance 的類定義了兩個實例屬性- ft 和 inch。這兩個距離對象的添加需要使用重載+運算符來執行。

為了實現這一點,神奇的方法__add__()被覆蓋,它執行兩個對象的英尺和英寸屬性的添加。 方法返回對象的字符串表示。

Example: Override add()

class distance:
    def __init__(self, x=None,y=None):
        self.ft=x
        self.inch=y
    def __add__(self,x):
        temp=distance()
        temp.ft=self.ft+x.ft
        temp.inch=self.inch+x.inch
        if temp.inch>=12:
            temp.ft+=1
            temp.inch-=12
            return temp
    def __str__(self):
        return 'ft:'+str(self.ft)+' in: '+str(self.inch) 

運行上面的 Python 腳本來驗證+運算符的重載操作。

>>> d1=distance(3,10)
>>> d2=distance(4,4)
>>> print("d1= {} d2={}".format(d1, d2))
d1= ft:3 in: 10 d2=ft:4 in: 4
>>> d3=d1+d2
>>> print(d3)
ft:8 in: 2

ge()方法

在距離類中增加以下方法來重載>=運算符。

Example: ge()

class distance:
    def __init__(self, x=None,y=None):
        self.ft=x
        self.inch=y
    def __ge__(self, x):
        val1=self.ft*12+self.inch
        val2=x.ft*12+x.inch
        if val1>=val2:
            return True
        else:
            return False 

當使用>=運算符並返回真或假時,調用該方法。相應地,可以顯示適當的信息

>>> d1=distance(2,1)
>>> d2=distance(4,10)
>>> d1>=d2
False

重要的魔術方法

下表列出了 Python 3 中的重要魔術方法。

初始化和構造描述
新 (cls,其他)在對象的實例化中被調用。
init(自身,其他)被 new 方法調用。
del(自我)析構函數方法。
一元運算符和函數描述
pos(自我)被要求一元正,例如+someobject。
neg(自我)為一元負數被調用,例如-someobject。
abs(自我)被內置的 abs()函數調用。
_ 反轉 _(自)使用~運算符進行反演。
_ 回合 _(自身,n)被內置 round()函數調用。
_ 樓層 _(自)被內置的 math.floor()函數調用。
ceil(自我)被內置的 math.ceil()函數調用。
trunc(自助)被內置的 math.trunc()函數調用。
擴充賦值描述
iadd(自身,其他)通過賦值來調用加法,例如 a +=b。
isub(自身,其他)在帶賦值的減法運算中被調用,例如 a -=b。
imul(自身、其他)被要求進行乘法運算,例如 a *=b。
ifloordiv(自身,其他)通過賦值調用整數除法,例如 a //=b。
idiv(自身,其他)被叫去分配任務,例如 a /=b。
itruediv(自身,其他)被叫去真正的部門分配任務
imod(自我,其他)通過賦值進行模調用,例如 a%=b。
ipow(自身、其他)在有賦值的指數上被調用,例如 a **=b。
ilshift(自身,其他)通過賦值(如 a<<=b)在按位左移時被調用。
irshift(自身,其他)通過賦值進行右位移位調用,例如 a >>=b。
_ _(自身,其他)通過賦值按位“與”調用,例如 a&=b。
ior(自我,其他)通過賦值按位“或”調用,例如 a|=b。
ixor(自身、其他)通過賦值進行按位異或調用,例如^=b.
類型轉換魔術方法描述
int(自我)由內置 int()方法調用,將類型轉換為 int。
float(自)由內置的浮點()方法調用,將類型轉換為浮點。
_ 複雜 _(自我)由內置的 complex()方法調用,將類型轉換為複雜類型。
_ 10 月 _ 日(自我)由內置的 int oct()方法調用,將類型轉換為八進制。
hex(自)由內置的 int hex()方法調用,將類型轉換為十六進制。
_ 索引 _(自我)當對象在切片表達式中使用時,在類型轉換為 int 時被調用。
trunc(自助)從 math.trunc()方法調用。
弦樂魔術方法描述
str(自我)方法調用以返回類型的字符串表示形式。
repr(自我)由內置的 int repr()方法調用以返回類型的機器可讀表示形式。
unicode(自我)由內置的 unicode()方法調用以返回類型的 unicode 字符串。
format(self,formatstr)由內置的 string.format()方法調用以返回新的字符串樣式。
hash(自我)由內置哈希()方法調用以返回一個整數。
_ 非零 _(自身)由內置 bool()方法調用以返回真或假。
dir(自助)由內置的 dir()方法調用以返回類的屬性列表。
sizeof(自我)由內置的 sys.getsizeof()方法調用以返回對象的大小。
屬性魔法方法描述
getattr(自我,姓名)當訪問不存在的類的屬性時調用。
setattr(自身、名稱、值)為類的屬性賦值時調用。
delattr(自我,姓名)在刪除類的屬性時調用。
運算符魔術方法描述
_ 添加 _(自身、其他)使用+運算符在添加操作時被調用
sub(自身、其他)使用-運算符在減法運算時被調用。
mul(自身、其他)使用*運算符調用乘法運算。
floordiv(自身、其他)使用//運算符調用樓層劃分操作。
truediv(自我,其他)使用/運算符調用除法運算。
mod(自身、其他)使用%運算符進行模運算時調用。
_ _(自身,其他[,模])使用**運算符計算功率時被調用。
lt(自我,其他)使用
le(自我,其他)使用< =運算符進行比較時調用。
eq(自我,他人)使用==運算符進行比較時調用。
ne(自身,其他)使用進行比較時調用!=運算符。
ge(自身,其他)使用> =運算符進行比較時調用。

因此,您可以使用適當的魔法方法在自定義類中添加各種功能。

Further Reading ** https://rszalski . github . io/magic cmmethod*****

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/306630.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-02 12:01
下一篇 2025-01-02 12:01

相關推薦

  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29

發表回復

登錄後才能評論