ホームページ > バックエンド開発 > Python チュートリアル > Pythonの継承と多重継承について簡単に解説(コード例)

Pythonの継承と多重継承について簡単に解説(コード例)

不言
リリース: 2018-09-12 17:53:17
オリジナル
2120 人が閲覧しました

この記事の内容は、Pythonの継承と多重継承について簡単に解説(コード例)したものであり、一定の参考価値がありますので、困っている方は参考にしていただければ幸いです。

次の点に注意してください:

組み込み型 (dict、list、str など) を直接サブクラス化すると、エラーが発生しやすくなります。これは、組み込み型のメソッドは通常、ユーザーがオーバーライドしたメソッドを無視するためです。 、サブクラス化しない 組み込み型を分類する場合、ユーザー定義クラスはコレクション モジュールを継承する必要があります。

    def __setitem__(self, key, value):
        super().__setitem__(key, [value] * 2) # 错误案例
class AnswerDict(dict):
    def __getitem__(self, item): # 错误案例
        return 42
import collections
class DoppelDict2(collections.UserDict): # 正确案例
    def __setitem__(self, key, value):
        super().__setitem__(key, [value] * 2)
class AnswerDict2(collections.UserDict): # 正确案例
    def __getitem__(self, item):
        return 42
ログイン後にコピー

多重継承に関連するもう 1 つの問題は、同じレベルのスーパークラスが同じ名前の属性を定義している場合です。Python はどの属性を使用するかをどのように決定しますか?

class DoppelDict(dict):
    def __setitem__(self, key, value):
        super().__setitem__(key, [value] * 2)
class AnswerDict(dict):
    def __getitem__(self, item):
        return 42
import collections
class DoppelDict2(collections.UserDict):
    def __setitem__(self, key, value):
        super().__setitem__(key, [value] * 2)
class AnswerDict2(collections.UserDict):
    def __getitem__(self, item):
        return 42
class A:
    def ping(self):
        print('Ping:', self)
class B(A):
    def pong(self):
        print('pong:', self)
class C(A):
    def pong(self):
        print('PONG:', self)
class D(B, C):
    def ping(self):
        super().ping()
        print('post-ping:', self)
    def pingpong(self):
        self.ping()
        super().ping()
        self.pong()
        super().pong()
        C.pong(self)
if __name__ == '__main__':
    d = D()
    print(d.pong()) # 输出来源于B
    print(C.pong(d)) #输出来源于C 超类的方法都可以直接调用,此时要把实例作为显示参数传入.
ログイン後にコピー

Python はどちらを区別できますか?メソッド解析順序
>>> D.mro()
[、<クラス '__main__.B'>、<クラス '__main__.C'>, , ]
メソッド呼び出しをスーパー クラスに委任する場合、推奨される方法は、組み込みの super( ) 関数。

次は d.pingpong() メソッドの解釈です

>>> self.ping()

Ping: <__main__.D object at 0x000002213877F2B0> post-ping: <__main__.D object at 0x000002213877F2B0> 最初の呼び出しは self.ping() で、クラス D の ping メソッドを実行します。 2 番目の呼び出し 1 つは super().ping() です。クラス D の ping メソッドをスキップして、クラス A の ping メソッドを見つけます。 Ping: <__main__.D object at 0x000002213877F2B0>

3 番目の呼び出しは次のとおりです。 self .pong() メソッドは、__mro__ に基づいて、クラス B によって実装された pong メソッドを検索します。 pong: <__main__.D object at 0x000002213877F2B0>

4 番目の呼び出しは super().pong() です。これも __mro__ に基づいており、クラス B によって実装された pong メソッドを見つけます。 pong: <__main__.D object at 0x000002213877F2B0>

5 番目の呼び出しは C.pong(self) で、__mro__ は無視され、C は見つかりました。クラスによって実装された pong メソッド。PONG: <__main__.D object at 0x000002213877F2B0>

関連する推奨事項:

Python の単一継承と多重継承


Python クラスと継承の説明

以上がPythonの継承と多重継承について簡単に解説(コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート