日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
每個程序員都應(yīng)該知道的11個Python魔術(shù)方法

譯者 | 布加迪

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比盧龍網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式盧龍網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋盧龍地區(qū)。費用合理售后完善,10年實體公司更值得信賴。

審校 | 重樓

在Python中,魔術(shù)方法(Magic Method)可以幫助您模擬Python類中內(nèi)置函數(shù)的行為。這些方法有前后雙下劃線(__),因此也被稱為Dunder方法。

這些魔術(shù)方法還可以幫助您在Python中實現(xiàn)操作符重載。您可能見過這樣的例子,就像兩個整數(shù)與乘法運算符*一起使用得到乘積一樣。當(dāng)它與字符串和整數(shù)k一起使用時,字符串會重復(fù)k次:

>>> 3 * 4
12
>>> 'code' * 3
'codecodecode'

我們在本文中將通過創(chuàng)建一個簡單的二維向量Vector2D類來探索Python中的魔術(shù)方法。

我們將從您可能熟悉的方法入手,逐步構(gòu)建更有幫助的魔術(shù)方法。

不妨開始編寫一些魔術(shù)方法!

1. __init__

考慮下面的Vector2D類:

class Vector2D:
 pass

一旦您創(chuàng)建了類,并實例化對象,就可以添加如下屬性:obj_name.attribute_name = value。

然而,您需要在實例化對象時初始化這些屬性,而不是手動向創(chuàng)建的每個實例添加屬性(當(dāng)然,這一點也不有趣?。?/p>

為此,您可以定義__init__方法。不妨為Vector2D類定義__init__方法:

class Vector2D:
 def __init__(self, x, y):
 self.x = x
 self.y = y

v = Vector2D(3, 5)

2. __repr__

當(dāng)您嘗試檢查或打印輸出實例化的對象時,您將發(fā)現(xiàn)沒有得到任何有幫助的信息。

v = Vector2D(3, 5)
print(v)

Output >>> <__main__.Vector2D object at 0x7d2fcfaf0ac0>

這就是為什么您應(yīng)該添加一個表示字符串,一個對象的字符串表示。為此,添加__repr__方法,如下所示:

class Vector2D:
 def __init__(self, x, y):
 self.x = x
 self.y = y

 def __repr__(self):
 return f"Vector2D(x={self.x}, y={self.y})"

v = Vector2D(3, 5)
print(v)


Output >>> Vector2D(x=3, y=5)

__repr__應(yīng)該包含創(chuàng)建類實例所需的所有屬性和信息。__repr__方法通常用于調(diào)試目的。

3. __str__

__str__也用于添加對象的字符串表示。通常,__str__方法用于為類的最終用戶提供信息。

不妨給我們的類添加一個__str__方法:

class Vector2D:
 def __init__(self, x, y):
 self.x = x
 self.y = y

 def __str__(self):
 return f"Vector2D(x={self.x}, y={self.y})"

v = Vector2D(3, 5)
print(v)


Output >>> Vector2D(x=3, y=5)

如果沒有__str__的實現(xiàn),它就返回到__repr__。因此對于您創(chuàng)建的每個類,您至少應(yīng)該添加__repr__方法。

4. __eq__

接下來,不妨添加一個方法來檢查Vector2D類的任意兩個對象是否相等。如果兩個向量有相同的x和y坐標,它們是相等的。

現(xiàn)在創(chuàng)建兩個具有相等x和y值的Vector2D對象,并比較它們是否相等:

v1 = Vector2D(3, 5)
v2 = Vector2D(3, 5)
print(v1 == v2)

結(jié)果為False,因為默認情況下比較會檢查內(nèi)存中對象ID是否相等。

Output >>> False

不妨添加__eq__方法來檢查是否相等:

class Vector2D:
 def __init__(self, x, y):
 self.x = x
 self.y = y

 def __repr__(self):
 return f"Vector2D(x={self.x}, y={self.y})"

 def __eq__(self, other):
 return self.x == other.x and self.y == other.y

檢查相等性現(xiàn)在應(yīng)該按預(yù)期工作:

v1 = Vector2D(3, 5)
v2 = Vector2D(3, 5)
print(v1 == v2)


Output >>> True

5. __len__

Python的內(nèi)置len()函數(shù)可以幫助您計算內(nèi)置可迭代對象(iterable)的長度。比如說,就向量而言,length應(yīng)該返回該向量所包含的元素的個數(shù)。

所以不妨為Vector2D類添加一個__len__方法:

class Vector2D:
 def __init__(self, x, y):
 self.x = x
 self.y = y

 def __repr__(self):
 return f"Vector2D(x={self.x}, y={self.y})"

 def __len__(self):
 return 2

v = Vector2D(3, 5)
print(len(v))

Vector2D類的所有對象長度為2:

Output >>> 2

6. __add__

現(xiàn)在不妨考慮對向量執(zhí)行的常見運算。不妨添加魔術(shù)方法來加減任意兩個向量。

如果您直接嘗試添加兩個向量對象,就會遇到錯誤。所以您應(yīng)該添加一個__add__方法:

class Vector2D:
 def __init__(self, x, y):
 self.x = x
 self.y = y

 def __repr__(self):
 return f"Vector2D(x={self.x}, y={self.y})"

 def __add__(self, other):
 return Vector2D(self.x + other.x, self.y + other.y)

您現(xiàn)在可以像這樣添加任意兩個向量:

v1 = Vector2D(3, 5)
v2 = Vector2D(1, 2)
result = v1 + v2
print(result)


Output >>> Vector2D(x=4, y=7)

7. __sub__

接下來,不妨添加一個__sub__方法來計算Vector2D類的任意兩個對象之間的差異:

class Vector2D:
 def __init__(self, x, y):
 self.x = x
 self.y = y

 def __repr__(self):
 return f"Vector2D(x={self.x}, y={self.y})"

 def __sub__(self, other):
 return Vector2D(self.x - other.x, self.y - other.y)


v1 = Vector2D(3, 5)
v2 = Vector2D(1, 2)
result = v1 - v2
print(result)


Output >>> Vector2D(x=2, y=3)

8. __mul__

我們還可以定義__mul__方法來定義對象之間的乘法。

不妨來處理:

  • 標量乘法:向量與標量的乘法
  • 內(nèi)積:兩個向量的點積
class Vector2D:
 def __init__(self, x, y):
 self.x = x
 self.y = y

 def __repr__(self):
 return f"Vector2D(x={self.x}, y={self.y})"

 def __mul__(self, other):
 # Scalar multiplication
 if isinstance(other, (int, float)):
 return Vector2D(self.x * other, self.y * other)
 # Dot product
 elif isinstance(other, Vector2D):
 return self.x * other.x + self.y * other.y
 else:
 raise TypeError("Unsupported operand type for *")

現(xiàn)在我們將舉幾個例子,看看__mul__方法是如何實際工作的。

v1 = Vector2D(3, 5)
v2 = Vector2D(1, 2)

# Scalar multiplication
result1 = v1 * 2
print(result1) 
# Dot product
result2 = v1 * v2
print(result2)


Output >>>

Vector2D(x=6, y=10)
13

9. __getitem__

__getitem__魔術(shù)方法讓您可以索引對象,并使用熟悉的方括號[]語法訪問屬性或?qū)傩郧衅?/p>

對于Vector2D類的對象v:

  • v [0]:x坐標
  • v [1]:y坐標

如果您嘗試通過索引訪問,您會遇到錯誤:

v = Vector2D(3, 5)
print(v[0],v[1])


---------------------------------------------------------------------------

TypeError  Traceback (most recent call last)

 in ()
----> 1 print(v[0],v[1])

TypeError: 'Vector2D' object is not subscriptable

不妨實現(xiàn)__getitem__ 方法:

class Vector2D:
 def __init__(self, x, y):
 self.x = x
 self.y = y

 def __repr__(self):
 return f"Vector2D(x={self.x}, y={self.y})"

 def __getitem__(self, key):
 if key == 0:
 return self.x
 elif key == 1:
 return self.y
 else:
 raise IndexError("Index out of range")

現(xiàn)在您可以使用索引訪問這些元素,如下所示:

v = Vector2D(3, 5)
print(v[0]) 
print(v[1])


Output >>>

3
5

10. __call__

借助__call__方法的實現(xiàn),您可以像調(diào)用函數(shù)一樣調(diào)用對象。

在Vector2D類中,我們可以實現(xiàn)__call__,按給定因子縮放向量:

class Vector2D:
 def __init__(self, x, y):
 self.x = x
 self.y = y

 def __repr__(self):
 return f"Vector2D(x={self.x}, y={self.y})"

 def __call__(self, scalar):
 return Vector2D(self.x * scalar, self.y * scalar)

如果您現(xiàn)在調(diào)用3,會得到縮放3倍的向量:

v = Vector2D(3, 5)
result = v(3)
print(result)


Output >>> Vector2D(x=9, y=15)

11. __getattr__

__getattr__方法用于獲取對象的特定屬性的值。

就這個例子而言,我們可以添加一個__getattr__ dunder方法,一旦被調(diào)用可計算向量的量值(L2-norm):

class Vector2D:
 def __init__(self, x, y):
 self.x = x
 self.y = y

 def __repr__(self):
 return f"Vector2D(x={self.x}, y={self.y})"

 def __getattr__(self, name):
 if name == "magnitude":
 return (self.x ** 2 + self.y ** 2) ** 0.5
 else:
 raise AttributeError(f"'Vector2D' object has no attribute '{name}'")

不妨驗證這是否像預(yù)期的那樣工作:

v = Vector2D(3, 4)
print(v.magnitude)


Output >>> 5.0

結(jié)論

這就是本教程的全部內(nèi)容!希望您已經(jīng)學(xué)會了如何為您的類添加魔術(shù)方法,以模擬內(nèi)置函數(shù)的行為。

我們已介紹了一些最有用的魔術(shù)方法,但這并非詳盡的清單。為了進一步理解,您可以創(chuàng)建一個所選擇的Python類,根據(jù)所需的功能添加魔術(shù)方法。最后祝編程愉快!

原文標題:Harness the Power of AI for Business,作者:Bala Priya C


分享名稱:每個程序員都應(yīng)該知道的11個Python魔術(shù)方法
標題鏈接:http://www.dlmjj.cn/article/djopeeg.html