Python中Dunder方法 特殊方法__xx__在Python中的運算符重載

dunder方法是python中以雙下劃線開頭和結尾的特殊方法,用于實現類的運算符重載和內置行為。它們讓自定義類可以支持如加法、比較、字符串表示等操作,例如__add__實現加法,__eq__和__lt__實現等于和小于比較,__len__實現長度獲取。使用時需注意:1. 不要濫用,避免語義不清的操作;2. 保持一致性,如實現__add__的同時考慮__radd__;3. 返回合適類型,通常返回新對象而非修改原對象;4. 符合不可變性預期??赏ㄟ^dir()函數查看類的dunder方法,幫助調試或學習代碼。

python中,Dunder方法(也叫“魔術方法”)是以雙下劃線開頭和結尾的方法,比如__init__、__add__等。它們讓類可以支持像加法、減法、字符串表示這樣的操作。最常見的用途之一就是運算符重載,也就是讓自定義對象可以使用像+、-這樣的操作符。


什么是Dunder方法?

Dunder是“double UNDERscore”的縮寫,這些方法不是隨便寫的,而是Python解釋器會自動調用的特殊方法。例如:

  • 當你寫a + b時,實際上是調用了a.__add__(b)
  • 當你打印一個對象時,調用的是它的__str__或__repr__

它們的存在是為了讓我們能夠為自定義類實現類似內置類型的行為。


如何用Dunder方法實現運算符重載?

如果你想讓你的類支持加法、比較、長度獲取等功能,就需要實現對應的Dunder方法。下面是一些常用的例子:

立即學習Python免費學習筆記(深入)”;

加法:__add__

class Point:     def __init__(self, x, y):         self.x = x         self.y = y      def __add__(self, other):         return Point(self.x + other.x, self.y + other.y)

這樣就可以這樣寫:

p1 = Point(1, 2) p2 = Point(3, 4) p3 = p1 + p2  # 實際上調用的是 p1.__add__(p2)

比較:__eq__ 和 __lt__

如果你希望兩個對象可以用==或

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

這樣你可以直接寫:

p1 == p2 p1 < p2

獲取長度:__len__

假設你的類有一個可度量的長度,比如一個向量:

def __len__(self):     return int((self.x**2 + self.y**2)**0.5)

然后你可以:

vec = Vector(3, 4) print(len(vec))  # 輸出 5

常見問題與注意事項

  • 不要濫用:并不是所有操作都需要重載。比如給一個用戶類加上+操作可能讓人困惑。
  • 保持一致性:如果你實現了__add__,最好也考慮是否需要實現__radd__以支持反向加法。
  • 返回合適的類型:比如加法應該返回新的對象而不是修改原對象。
  • 注意不可變性:像+操作通常不會改變原對象,這一點要符合預期。

小技巧:如何查看一個類有哪些Dunder方法?

你可以用dir()函數看看某個類或實例有哪些可用的Dunder方法:

dir(Point)

或者只看以雙下劃線開頭的方法:

[m for m in dir(Point) if m.startswith('__') and m.endswith('__')]

這在調試或學習別人的代碼時特別有用。


基本上就這些了。Dunder方法看起來高級,但其實只要理解了它們的作用機制,就能很自然地用好它們。關鍵是在合適的時候用,別為了炫技而用。

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享