<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、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] ## **概述** ### **用途** ABC,Abstract Base Class(抽象基類),主要定義了基本類和最基本的抽象方法,可以為子類定義共有的API,不需要具體實現。相當于是Java中的接口或者是抽象類。 抽象基類可以不實現具體的方法(當然也可以實現,只不過子類如果想調用抽象基類中定義的方法需要使用super())而是將其留給派生類實現。 ### python實現 Python 對于ABC的支持模塊是abc模塊,常用的是如下方法: `abc.ABCMeta`這是用來生成抽象基礎類的元類。由它生成的類可以被直接繼承。 `abc.ABC`輔助類,讓你可以不用關心元類概念,直接繼承它,就有了ABCMeta元類。使用時注意元類沖突 `@abc.abstractmethod`定義抽象方法. `@abstractproperty `定義抽象抽象屬性. ### **作用** 抽象基類提供了邏輯和實現解耦的能力,即在不同的模塊中通過抽象基類來調用,可以用最精簡的方式展示出代碼之間的邏輯關系,讓模塊之間的依賴清晰簡單。 同時,一個抽象類可以有多個實現,讓系統的運轉更加靈活。而針對抽象類的編程,讓每個人可以關注當前抽象類,只關注其方法和描述,而不需要考慮過多的其他邏輯,這對協同開發有很大意義。極簡版的抽象類實現,也讓代碼可讀性更高。 ## **抽象基類的使用:** 通過`@abc.abstractmethod`將方法聲明為抽象方法。具體化抽象類可以有兩種方式,**一種通過注冊(register),另外一種通過繼承。** ### **1:直接繼承** 直接繼承抽象基類的子類就沒有這么靈活,抽象基類中可以聲明”抽象方法“和“抽象屬性”,只有完全覆寫(實現)了抽象基類中的“抽象”內容后,才能被實例化,而虛擬子類則不受此影響。 **繼承方式的優點**:直接從抽象基類派生子類有一個好處,**除非子類實現抽象基類的抽象方法,否則子類不能實例化。** ~~~ import abc class PluginBase(metaclass=abc.ABCMeta): @abc.abstractmethod def load(self, input): pass @abc.abstractmethod def save(self, output, data): pass class SubclassImpementation(PluginBase): def load(self, input): return input.read() def save(self, output, data): return output.write(data) # 繼承,必須實現所有抽象方法 print(issubclass(SubclassImpementation, PluginBase)) print(isinstance(SubclassImpementation(), PluginBase)) ~~~ ### **2:虛擬子類** 將其他的類”注冊“到抽象基類下當虛擬子類(調用register方法),虛擬子類的好處是你實現的第三方子類不需要直接繼承自基類,可以實現抽象基類中的部分API接口,也可以根本不實現,但是issubclass(), issubinstance()進行判斷時仍然返回真值。 **注冊方式的缺點**:不會出現在類的`MRO`(Method Resolution Order),故而也不能通過`super()`來調用抽象方法。當沒有實現抽象方法時,實例化時候不會報錯,只有在調用時候才會報錯。 ~~~ import abc class PluginBase(metaclass=abc.ABCMeta): @abc.abstractmethod def load(self, input): pass @abc.abstractmethod def save(self, output, data): pass class LocalBaseClass(object): pass class RegisteredImplementation(LocalBaseClass): def load(self, input): return input.read() # 注冊,可以不必實現所有抽象方法 PluginBase.register(RegisteredImplementation) print(issubclass(RegisteredImplementation, PluginBase)) print(isinstance(RegisteredImplementation(), PluginBase)) ~~~
                  <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>

                              哎呀哎呀视频在线观看