新聞中心
Python 中的魔法方法是以雙下劃線開(kāi)始和結(jié)束的特殊方法。它們也被稱為鄧德方法。魔法方法并不意味著由您直接調(diào)用,而是在某個(gè)動(dòng)作上從類內(nèi)部進(jìn)行調(diào)用。例如,當(dāng)您使用+運(yùn)算符將兩個(gè)數(shù)字相加時(shí),在內(nèi)部將調(diào)用__add__()方法。

10余年的碌曲網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營(yíng)銷型網(wǎng)站的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整碌曲建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)建站從事“碌曲網(wǎng)站設(shè)計(jì)”,“碌曲網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
Python 中的內(nèi)置類定義了許多神奇的方法。使用dir()函數(shù)查看一個(gè)類繼承的魔法方法數(shù)量。 例如,下面列出了在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__方法是一種神奇的方法,當(dāng)我們使用+運(yùn)算符將兩個(gè)數(shù)字相加時(shí),它就會(huì)被調(diào)用。 考慮以下示例。 T3】
>>> num=10
>>> num + 5
15
>>> num.__add__(5)
15可以看到,當(dāng)你做num+10時(shí),+運(yùn)算符調(diào)用__add__(10)方法。 也可以直接打num.__add__(5)會(huì)給出同樣的結(jié)果。 然而,如前所述,魔法方法并不意味著被直接調(diào)用,而是在內(nèi)部,通過(guò)一些其他的方法或動(dòng)作。
在 Python 中,魔術(shù)方法最常用于定義預(yù)定義運(yùn)算符的重載行為。例如,默認(rèn)情況下,算術(shù)運(yùn)算符對(duì)數(shù)字操作數(shù)進(jìn)行運(yùn)算。這意味著數(shù)值對(duì)象必須與+、-、*、/等運(yùn)算符一起使用。+運(yùn)算符也被定義為字符串、列表和元組類中的串聯(lián)運(yùn)算符。我們可以說(shuō)+運(yùn)算符是重載的。
為了使重載行為在您自己的自定義類中可用,應(yīng)該重寫(xiě)相應(yīng)的 magic 方法。例如,為了將+運(yùn)算符用于用戶定義類的對(duì)象,它應(yīng)該包括__add__()方法。
讓我們看看如何實(shí)現(xiàn)和使用一些重要的魔術(shù)方法。
new()方法
Java 和 C# 等語(yǔ)言使用新的運(yùn)算符來(lái)創(chuàng)建類的新實(shí)例。在 Python 中,__new__()魔法方法在__init__()方法之前被隱式調(diào)用。__new__()方法返回一個(gè)新的對(duì)象,然后由__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' 當(dāng)您創(chuàng)建Employee類的實(shí)例時(shí),上面的示例將產(chǎn)生以下輸出。
>>> emp = Employee()
__new__ magic method is called
__init__ magic method is called因此,在__init__()方法之前調(diào)用__new__()方法。
str()方法
另一個(gè)有用的魔法方法是__str__()。它被重寫(xiě)以返回任何用戶定義類的可打印字符串表示形式。 我們已經(jīng)看到str()內(nèi)置函數(shù)從對(duì)象參數(shù)返回一個(gè)字符串。例如,str(12)返回‘12’。當(dāng)被調(diào)用時(shí),它調(diào)用 int 類中的__str__()方法。
>>> num=12
>>> str(num)
'12'
>>> #This is equivalent to
>>> int.__str__(num)
'12'現(xiàn)在讓我們重寫(xiě) Employee 類中的__str__()方法,以返回其對(duì)象的字符串表示。
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()函數(shù)如何在內(nèi)部調(diào)用員工類中定義的__str__()方法。這就是為什么它被稱為神奇的方法!
>>> e1=Employee()
>>> print(e1)
name=Swati salary=$10000add()方法
在下面的示例中,一個(gè)名為 distance 的類定義了兩個(gè)實(shí)例屬性- ft 和 inch。這兩個(gè)距離對(duì)象的添加需要使用重載+運(yùn)算符來(lái)執(zhí)行。
為了實(shí)現(xiàn)這一點(diǎn),神奇的方法__add__()被覆蓋,它執(zhí)行兩個(gè)對(duì)象的英尺和英寸屬性的添加。 方法返回對(duì)象的字符串表示。
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) 運(yùn)行上面的 Python 腳本來(lái)驗(yàn)證+運(yùn)算符的重載操作。
>>> 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: 2ge()方法
在距離類中增加以下方法來(lái)重載>=運(yùn)算符。
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 當(dāng)使用>=運(yùn)算符并返回真或假時(shí),調(diào)用該方法。相應(yīng)地,可以顯示適當(dāng)?shù)男畔?/p>
>>> d1=distance(2,1)
>>> d2=distance(4,10)
>>> d1>=d2
False重要的魔術(shù)方法
下表列出了 Python 3 中的重要魔術(shù)方法。
| 初始化和構(gòu)造 | 描述 |
|---|---|
| 新 (cls,其他) | 在對(duì)象的實(shí)例化中被調(diào)用。 |
| init(自身,其他) | 被 new 方法調(diào)用。 |
| del(自我) | 析構(gòu)函數(shù)方法。 |
| 一元運(yùn)算符和函數(shù) | 描述 |
|---|---|
| pos(自我) | 被要求一元正,例如+someobject。 |
| neg(自我) | 為一元負(fù)數(shù)被調(diào)用,例如-someobject。 |
| abs(自我) | 被內(nèi)置的 abs()函數(shù)調(diào)用。 |
| _ 反轉(zhuǎn) _(自) | 使用~運(yùn)算符進(jìn)行反演。 |
| _ 回合 _(自身,n) | 被內(nèi)置 round()函數(shù)調(diào)用。 |
| _ 樓層 _(自) | 被內(nèi)置的 math.floor()函數(shù)調(diào)用。 |
| ceil(自我) | 被內(nèi)置的 math.ceil()函數(shù)調(diào)用。 |
| trunc(自助) | 被內(nèi)置的 math.trunc()函數(shù)調(diào)用。 |
| 擴(kuò)充賦值 | 描述 |
|---|---|
| iadd(自身,其他) | 通過(guò)賦值來(lái)調(diào)用加法,例如 a +=b。 |
| isub(自身,其他) | 在帶賦值的減法運(yùn)算中被調(diào)用,例如 a -=b。 |
| imul(自身、其他) | 被要求進(jìn)行乘法運(yùn)算,例如 a *=b。 |
| ifloordiv(自身,其他) | 通過(guò)賦值調(diào)用整數(shù)除法,例如 a //=b。 |
| idiv(自身,其他) | 被叫去分配任務(wù),例如 a /=b。 |
| itruediv(自身,其他) | 被叫去真正的部門(mén)分配任務(wù) |
| imod(自我,其他) | 通過(guò)賦值進(jìn)行模調(diào)用,例如 a%=b。 |
| ipow(自身、其他) | 在有賦值的指數(shù)上被調(diào)用,例如 a **=b。 |
| ilshift(自身,其他) | 通過(guò)賦值(如 a<<=b)在按位左移時(shí)被調(diào)用。 |
| irshift(自身,其他) | 通過(guò)賦值進(jìn)行右位移位調(diào)用,例如 a >>=b。 |
| _ 和 _(自身,其他) | 通過(guò)賦值按位“與”調(diào)用,例如 a&=b。 |
| ior(自我,其他) | 通過(guò)賦值按位“或”調(diào)用,例如 a|=b。 |
| ixor(自身、其他) | 通過(guò)賦值進(jìn)行按位異或調(diào)用,例如^=b. |
| 類型轉(zhuǎn)換魔術(shù)方法 | 描述 |
|---|---|
| int(自我) | 由內(nèi)置 int()方法調(diào)用,將類型轉(zhuǎn)換為 int。 |
| float(自) | 由內(nèi)置的浮點(diǎn)()方法調(diào)用,將類型轉(zhuǎn)換為浮點(diǎn)。 |
| _ 復(fù)雜 _(自我) | 由內(nèi)置的 complex()方法調(diào)用,將類型轉(zhuǎn)換為復(fù)雜類型。 |
| _ 10 月 _ 日(自我) | 由內(nèi)置的 int oct()方法調(diào)用,將類型轉(zhuǎn)換為八進(jìn)制。 |
| hex(自) | 由內(nèi)置的 int hex()方法調(diào)用,將類型轉(zhuǎn)換為十六進(jìn)制。 |
| _ 索引 _(自我) | 當(dāng)對(duì)象在切片表達(dá)式中使用時(shí),在類型轉(zhuǎn)換為 int 時(shí)被調(diào)用。 |
| trunc(自助) | 從 math.trunc()方法調(diào)用。 |
| 弦樂(lè)魔術(shù)方法 | 描述 |
|---|---|
| str(自我) | 方法調(diào)用以返回類型的字符串表示形式。 |
| repr(自我) | 由內(nèi)置的 int repr()方法調(diào)用以返回類型的機(jī)器可讀表示形式。 |
| unicode(自我) | 由內(nèi)置的 unicode()方法調(diào)用以返回類型的 unicode 字符串。 |
| format(self,formatstr) | 由內(nèi)置的 string.format()方法調(diào)用以返回新的字符串樣式。 |
| hash(自我) | 由內(nèi)置哈希()方法調(diào)用以返回一個(gè)整數(shù)。 |
| _ 非零 _(自身) | 由內(nèi)置 bool()方法調(diào)用以返回真或假。 |
| dir(自助) | 由內(nèi)置的 dir()方法調(diào)用以返回類的屬性列表。 |
| sizeof(自我) | 由內(nèi)置的 sys.getsizeof()方法調(diào)用以返回對(duì)象的大小。 |
| 屬性魔法方法 | 描述 |
|---|---|
| getattr(自我,姓名) | 當(dāng)訪問(wèn)不存在的類的屬性時(shí)調(diào)用。 |
| setattr(自身、名稱、值) | 為類的屬性賦值時(shí)調(diào)用。 |
| delattr(自我,姓名) | 在刪除類的屬性時(shí)調(diào)用。 |
| 運(yùn)算符魔術(shù)方法 | 描述 |
|---|---|
| _ 添加 _(自身、其他) | 使用+運(yùn)算符在添加操作時(shí)被調(diào)用 |
| sub(自身、其他) | 使用-運(yùn)算符在減法運(yùn)算時(shí)被調(diào)用。 |
| mul(自身、其他) | 使用*運(yùn)算符調(diào)用乘法運(yùn)算。 |
| floordiv(自身、其他) | 使用//運(yùn)算符調(diào)用樓層劃分操作。 |
| truediv(自我,其他) | 使用/運(yùn)算符調(diào)用除法運(yùn)算。 |
| mod(自身、其他) | 使用%運(yùn)算符進(jìn)行模運(yùn)算時(shí)調(diào)用。 |
| _ 冪 _(自身,其他[,模]) | 使用**運(yùn)算符計(jì)算功率時(shí)被調(diào)用。 |
| lt(自我,其他) | 使用 |
| le(自我,其他) | 使用< =運(yùn)算符進(jìn)行比較時(shí)調(diào)用。 |
| eq(自我,他人) | 使用==運(yùn)算符進(jìn)行比較時(shí)調(diào)用。 |
| ne(自身,其他) | 使用進(jìn)行比較時(shí)調(diào)用!=運(yùn)算符。 |
| ge(自身,其他) | 使用> =運(yùn)算符進(jìn)行比較時(shí)調(diào)用。 |
因此,您可以使用適當(dāng)?shù)哪Хǚ椒ㄔ谧远x類中添加各種功能。
Further Reading ** https://rszalski . github . io/magic cmmethod*****
網(wǎng)頁(yè)題目:Python魔術(shù)或鄧德方法
網(wǎng)頁(yè)路徑:http://m.fisionsoft.com.cn/article/djhpejp.html


咨詢
建站咨詢
