この記事の内容は、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 サイトの他の関連記事を参照してください。