<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Python 運算符重載 > 原文: [https://www.programiz.com/python-programming/operator-overloading](https://www.programiz.com/python-programming/operator-overloading) #### 您可以根據所使用的操作數來更改 Python 中運算符的含義。 在本教程中,您將學習如何在 Python 面向對象編程中使用運算符重載。 ## Python 運算符重載 [Python 運算符](/python-programming/operators)用于內置類。 但是同一運算符對于不同類型的行為會有所不同。 例如,`+`運算符將對兩個數字執行算術加法,合并兩個列表或連接兩個字符串。 Python 中的這種功能允許同一運算符根據上下文具有不同的含義,這稱為運算符重載。 那么,當我們將它們與用戶定義類的對象一起使用時會發生什么呢? 讓我們考慮下面的類,它試圖在二維坐標系中模擬一個點。 ```py class Point: def __init__(self, x=0, y=0): self.x = x self.y = y p1 = Point(1, 2) p2 = Point(2, 3) print(p1+p2) ``` **輸出** ```py Traceback (most recent call last): File "<string>", line 9, in <module> print(p1+p2) TypeError: unsupported operand type(s) for +: 'Point' and 'Point' ``` 在這里,我們可以看到出現了`TypeError`,因為 Python 不知道如何將兩個`Point`對象加在一起。 但是,我們可以通過運算符重載在 Python 中完成此任務。 但是首先,讓我們對特殊函數有所了解。 * * * ## Python 特殊函數 以雙下劃線`__`開頭的類函數在 Python 中稱為特殊函數。 這些函數不是我們為類定義的典型函數。 我們上面定義的`__init__()`函數就是其中之一。 每次我們創建該類的新對象時都會調用它。 Python 中還有許多其他特殊函數。 訪問 [Python 特殊函數](http://docs.python.org/3/reference/datamodel.html#special-method-names)了解有關它們的更多信息。 使用特殊函數,我們可以使我們的類與內置函數兼容。 ```py >>> p1 = Point(2,3) >>> print(p1) <__main__.Point object at 0x00000000031F8CC0> ``` 假設我們希望`print()`函數打印`Point`對象的坐標,而不是所得到的。 我們可以在我們的類中定義`__str__()`方法,該方法控制對象的打印方式。 讓我們看看如何實現這一目標: ```py class Point: def __init__(self, x = 0, y = 0): self.x = x self.y = y def __str__(self): return "({0},{1})".format(self.x,self.y) ``` 現在,讓我們再次嘗試`print()`函數。 ```py class Point: def __init__(self, x=0, y=0): self.x = x self.y = y def __str__(self): return "({0}, {1})".format(self.x, self.y) p1 = Point(2, 3) print(p1) ``` **輸出**: ```py (2, 3) ``` 這樣更好,事實證明,當我們使用內置函數`str()`或`format()`時,將調用相同的方法。 ```py >>> str(p1) '(2,3)' >>> format(p1) '(2,3)' ``` 因此,當您使用`str(p1)`或`format(p1)`時,Python 內部會調用`p1.__str__()`方法。 因此得名,特殊函數。 現在讓我們回到操作符重載。 * * * ## 重載`+`運算符 要重載`+`運算符,我們將需要在該類中實現`__add__()`函數。 擁有權利的同時也被賦予了重大的責任。 我們可以在此函數內做任何喜歡的事情。 但是返回坐標和的`Point`對象更為明智。 ```py class Point: def __init__(self, x=0, y=0): self.x = x self.y = y def __str__(self): return "({0},{1})".format(self.x, self.y) def __add__(self, other): x = self.x + other.x y = self.y + other.y return Point(x, y) ``` 現在讓我們再次嘗試加法操作: ```py class Point: def __init__(self, x=0, y=0): self.x = x self.y = y def __str__(self): return "({0},{1})".format(self.x, self.y) def __add__(self, other): x = self.x + other.x y = self.y + other.y return Point(x, y) p1 = Point(1, 2) p2 = Point(2, 3) print(p1+p2) ``` **輸出**: ```py (3,5) ``` 實際發生的是,當您使用`p1 + p2`時,Python 會調用`p1.__add__(p2)`,而后者依次為`Point.__add__(p1,p2)`。 此后,將按照我們指定的方式執行加法運算。 同樣,我們也可以重載其他運算符。 我們需要實現的特殊函數列表如下。 | 運算符 | 表達式 | 內部 | | --- | --- | --- | | 加成 | `p1 + p2` | `p1.__add__(p2)` | | 減法 | `p1 - p2` | `p1.__sub__(p2)` | | 乘法 | `p1 * p2` | `p1.__mul__(p2)` | | 冪 | `p1 ** p2` | `p1.__pow__(p2)` | | 除法 | `p1 / p2` | `p1.__truediv__(p2)` | | 整數除法 | `p1 // p2` | `p1.__floordiv__(p2)` | | 余數(模) | `p1 % p2` | `p1.__mod__(p2)` | | 按位左移 | `p1 << p2` | `p1.__lshift__(p2)` | | 按位右移 | `p1 >> p2` | `p1.__rshift__(p2)` | | 按位與 | `p1 & p2` | `p1.__and__(p2)` | | 按位或 | `p1 &#124; p2` | `p1.__or__(p2)` | | 按位異或 | `p1 ^ p2` | `p1.__xor__(p2)` | | 按位非 | `~p1` | `p1.__invert__()` | * * * ## 重載比較運算符 Python 不僅將運算符重載不限于算術運算符。 我們也可以重載比較運算符。 假設我們想在我們的`Point`類中實現小于符號`<`符號。 讓我們從原點比較這些點的大小,并為此目的返回結果。 可以如下實現。 ```py # overloading the less than operator class Point: def __init__(self, x=0, y=0): self.x = x self.y = y def __str__(self): return "({0},{1})".format(self.x, self.y) def __lt__(self, other): self_mag = (self.x ** 2) + (self.y ** 2) other_mag = (other.x ** 2) + (other.y ** 2) return self_mag < other_mag p1 = Point(1,1) p2 = Point(-2,-3) p3 = Point(1,-1) # use less than print(p1<p2) print(p2<p3) print(p1<p3) ``` **輸出**: ```py True False False ``` 類似地,下面列出了我們需要實現以重載其他比較運算符的特殊函數。 | 運算符 | 表達式 | 內部 | | --- | --- | --- | | 小于 | `p1 < p2` | `p1.__lt__(p2)` | | 小于或等于 | `p1 <= p2` | `p1.__le__(p2)` | | 等于 | `p1 == p2` | `p1.__eq__(p2)` | | 不等于 | `p1 != p2` | `p1.__ne__(p2)` | | 大于 | `p1 > p2` | `p1.__gt__(p2)` | | 大于或等于 | `p1 >= p2` | `p1.__ge__(p2)` |
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看