<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 5.6.?專用類方法 * 5.6.1\. 獲得和設置數據項 除了普通的類方法,Python 類還可以定義專用方法。專用方法是在特殊情況下或當使用特別語法時由 Python 替你調用的,而不是在代碼中直接調用 (像普通的方法那樣)。 就像你在[上一節](userdict.html "5.5.?探索 UserDict:一個封裝類")所看到的,普通的方法對在類中封裝字典很有幫助。但是只有普通方法是不夠的,因為除了對字典調用方法之外,還有很多事情可以做的。例如,你可以通過一種沒有包括明確方法調用的語法來[獲得](../native_data_types/index.html#odbchelper.dict.define "例?3.1.?定義 Dictionary")和[設置](../native_data_types/index.html#odbchelper.dict.modify "例?3.2.?修改 Dictionary")數據項。這就是專用方法產生的原因:它們提供了一種方法,可以將非方法調用語法映射到方法調用上。 ## 5.6.1.?獲得和設置數據項 ## 例?5.12.?`__getitem__` 專用方法 ``` def __getitem__(self, key): return self.data[key] ``` ``` >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__getitem__("name") '/music/_singles/kairo.mp3' >>> f["name"] '/music/_singles/kairo.mp3' ``` | | | | --- | --- | | \[1\] | `__getitem__` 專用方法很簡單。像普通的方法 `clear`,`keys` 和 `values` 一樣,它只是重定向到字典,返回字典的值。但是怎么調用它呢?哦,你可以直接調用 `__getitem__`,但是在實際中你其實不會那樣做:我在這里執行它只是要告訴你它是如何工作的。正確地使用 `__getitem__` 的方法是讓 Python 來替你調用。 | | \[2\] | 這個看上去就像你用來[得到一個字典值](../native_data_types/index.html#odbchelper.dict.define "例?3.1.?定義 Dictionary")的語法,事實上它返回你期望的值。下面是隱藏起來的一個環節:暗地里,Python 已經將這個語法轉化為 `f.__getitem__("name")` 的方法調用。這就是為什么 `__getitem__` 是一個專用類方法的原因,不僅僅是你可以自已調用它,還可以通過使用正確的語法讓 Python 來替你調用。 | 當然,Python 有一個與 `__getitem__` 類似的 `__setitem__` 專用方法,參見下面的例子。 ## 例?5.13.?`__setitem__` 專用方法 ``` def __setitem__(self, key, item): self.data[key] = item ``` ``` >>> f {'name':'/music/_singles/kairo.mp3'} >>> f.__setitem__("genre", 31) >>> f {'name':'/music/_singles/kairo.mp3', 'genre':31} >>> f["genre"] = 32 >>> f {'name':'/music/_singles/kairo.mp3', 'genre':32} ``` | | | | --- | --- | | \[1\] | 與 `__getitem__` 方法一樣,`__setitem__` 簡單地重定向到真正的字典 `self.data` ,讓它來進行工作。并且像 `__getitem__` 一樣,通常你不會直接調用它,當你使用了正確的語法,Python 會替你調用 `__setitem__` 。 | | \[2\] | 這個看上去像正常的字典語法,當然除了 `f` 實際上是一個類,它盡可能地打扮成一個字典,并且 `__setitem__` 是打扮的一個重點。這行代碼實際上暗地里調用了 `f.__setitem__("genre", 32)`。 | `__setitem__` 是一個專用類方法,因為它可以讓 Python 來替你調用,但是它仍然是一個類方法。就像在 `UserDict` 中定義 `__setitem__` 方法一樣容易,我們可以在子類中重新定義它,對父類的方法進行覆蓋。這就允許我們定義出在某些方面像字典一樣動作的類,但是可以定義它自已的行為,超過和超出內置的字典。 這個概念是本章中我們正在學習的整個框架的基礎。每個文件類型可以擁有一個處理器類,這些類知道如何從一個特殊的文類型得到元數據。只要知道了某些屬性 (像文件名和位置),處理器類就知道如何自動地得到其它的屬性。它的實現是通過覆蓋 `__setitem__` 方法,檢查特別的關鍵字,然后當找到后加入額外的處理。 例如,`MP3FileInfo` 是 `FileInfo` 的子類。在設置了一個 `MP3FileInfo` 類的 `name` 時,并不只是設置 `name` 關鍵字 (像父類 `FileInfo` 所做的),它還要在文件自身內進行搜索 MP3 的標記然后填充一整套關鍵字。下面的例子將展示其工作方式。 ## 例?5.14.?在 `MP3FileInfo` 中覆蓋 `__setitem__` ``` def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item) ``` | | | | --- | --- | | \[1\] | 注意我們的 `__setitem__` 方法嚴格按照與父類方法相同的形式進行定義。這一點很重要,因為 Python 將替你執行方法,而它希望這個函數用確定個數的參數進行定義。(從技術上說,參數的名字沒有關系,只是個數。) | | \[2\] | 這里就是整個 `MP3FileInfo` 類的難點:如果給 `name` 關鍵字賦一個值,我們還想做些額外的事情。 | | \[3\] | 我們對 `name` 所做的額外處理封裝在了 `__parse` 方法中。這是定義在 `MP3FileInfo` 中的另一個類方法,則當我們調用它時,我們用 `self` 對其限定。僅是調用 `__parse` 將只會看成定義在類外的普通方法,調用 `self.__parse` 將會看成定義在類中的一個類方法。這不是什么新東西,你用同樣的方法來引用[數據屬性](userdict.html#fileinfo.userdict.normalmethods "例?5.10.?UserDict 常規方法")。 | | \[4\] | 在做完我們額外的處理之后,我們需要調用父類的方法。記住,在 Python 中不會自動為你完成,需手工執行。注意,我們在調用直接父類,`FileInfo`,盡管它沒有 `__setitem__` 方法。沒問題,因為 Python 將會沿著父類樹走,直到它找到一個擁有我們正在調用方法的類,所以這行代碼最終會找到并且調用定義在 `UserDict` 中的 `__setitem__`。 | > 注意 > 當在一個類中存取數據屬性時,你需要限定屬性名:`self._attribute_`。當調用類中的其它方法時,你屬要限定方法名:`self._method_`。 ## 例?5.15.?設置 `MP3FileInfo` 的 `name` ``` >>> import fileinfo >>> mp3file = fileinfo.MP3FileInfo() >>> mp3file {'name':None} >>> mp3file["name"] = "/music/_singles/kairo.mp3" >>> mp3file {'album': 'Rave Mix', 'artist': '***DJ MARY-JANE***', 'genre': 31, 'title': 'KAIRO****THE BEST GOA', 'name': '/music/_singles/kairo.mp3', 'year': '2000', 'comment': 'http://mp3.com/DJMARYJANE'} >>> mp3file["name"] = "/music/_singles/sidewinder.mp3" >>> mp3file {'album': '', 'artist': 'The Cynic Project', 'genre': 18, 'title': 'Sidewinder', 'name': '/music/_singles/sidewinder.mp3', 'year': '2000', 'comment': 'http://mp3.com/cynicproject'} ``` | | | | --- | --- | | \[1\] | 首先,我們創建了一個 `MP3FileInfo` 的實例,沒有傳遞給它文件名。(我們可以不用它,因為 `__init__` 方法的 `filename` 參數是[可選的](../power_of_introspection/optional_arguments.html "4.2.?使用可選參數和命名參數")。) 因為 `MP3FileInfo` 沒有它自已的 `__init__` 方法,Python 沿著父類樹走,發現了 `FileInfo` 的 `__init__` 方法。這個 `__init__` 方法手工調用了 `UserDict` 的 `__init__` 方法,然后設置 `name` 關鍵字為 `filename`,它為 `None`,因為我們還沒有傳入一個文件名。所以,`mp3file` 最初看上去像是有一個關鍵字的字典,`name` 的值為 `None`。 | | \[2\] | 現在真正有趣的開始了。設置 `mp3file` 的 `name` 關鍵字觸發了 `MP3FileInfo` 上的 `__setitem__` 方法 (而不是 `UserDict` 的),這個方法注意到我們正在用一個真實的值來設置 `name` 關鍵字,接著調用 `self.__parse`。盡管我們完全還沒有研究過 `__parse` 方法,從它的輸出你可以看出,它設置了其它幾個關鍵字:`album`、`artist`、`genre`、`title`、`year` 和 `comment`。 | | \[3\] | 修改 `name` 關鍵字將再次經受同樣的處理過程:Python 調用 `__setitem__`,`__setitem__`調用 `self.__parse`,`self.__parse` 設置其它所有的關鍵字。 |
                  <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>

                              哎呀哎呀视频在线观看