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

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

不言
不言オリジナル
2018-09-12 17:53:172054ブラウズ

この記事の内容は、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()
[6211673070b9770edfdd00deef5a7933, d65e71c32c2035ca4f3e3c46100a7a5f, 0b6b3070adce8118f880cf43f8bc8037]
メソッド呼び出しをスーパー クラスに委任する場合、推奨される方法は、組み込みの super( ) 関数。

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

>>> self.ping()

Ping: 51c9255e984783507746d24bd1018f2c post-ping: 51c9255e984783507746d24bd1018f2c 最初の呼び出しは 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: 51c9255e984783507746d24bd1018f2c

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

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

関連する推奨事項:

Python の単一継承と多重継承


Python クラスと継承の説明

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。