目次
ひし形の継承
補足内容
ホームページ バックエンド開発 Python チュートリアル Python の多重継承におけるダイヤモンド継承

Python の多重継承におけるダイヤモンド継承

Feb 12, 2020 pm 12:45 PM
python 多重継承

この記事では、Python の多重継承におけるダイヤモンド継承の使い方を紹介します。これから Python を学習する友人の参考になれば幸いです。

Python の多重継承におけるダイヤモンド継承

継承はオブジェクト指向プログラミングの重要な方法であり、継承を通じてサブクラスは親クラスの機能を拡張できます。 Python では、クラスは複数の親クラスから継承することができ、これを Python の 多重継承 (多重継承) と呼びます。

構文

class SubclassName(BaseClass1, BaseClass2, BaseClass3, ...):
    pass
ログイン後にコピー

ひし形の継承

推奨学習: Python ビデオ チュートリアル

複数レベルでの継承多重継承と併用すると、多重継承など複雑な継承関係が現れます。

その中に、ダイヤモンドの継承が登場します。以下に示すように。 Python の多重継承におけるダイヤモンド継承

この構造では呼び出し順序に疑問があります。呼び出し順序は次のどれですか?

  • D-> B-> A->C (深さ優先)
  • D->B->C->A (幅優先)

答えてみましょうこの質問。

例を見てみましょう:

class A():
    def __init__(self):
        print('init A...')
        print('end A...')

class B(A):
    def __init__(self):
        print('init B...')
        A.__init__(self)
        print('end B...')

class C(A):
    def __init__(self):
        print('init C...')
        A.__init__(self)
        print('end C...')

class D(B, C):
    def __init__(self):
        print('init D...')
        B.__init__(self)
        C.__init__(self)
        print('end D...')

if __name__ == '__main__':
    D()
ログイン後にコピー

出力結果

init D...
init B...
init A...
end A...
end B...
init C...
init A...
end A...
end C...
end D...
ログイン後にコピー

出力結果からの呼び出しシーケンスは次のとおりです: D->B->A->C ->A. B と C が共同で A を継承し、A が 2 回呼び出されていることがわかります。 A を 2 回呼び出す必要はありません。

実は、上記の問題の根本原因はすべて MRO に関係しています。MRO (Method Resolution Order)Method Resolution Order とも呼ばれ、主に使用されます。多重継承時の解決を決定します。属性はどのクラスから来ますか? C3 というアルゴリズムを使用します。基本的な考え方は、 は幅を最初に使用し、左から右へ、同じクラスが複数回呼び出される場合、必要なプロパティとメソッドを見つけるための原則。

それでは、最上位の親クラスのメソッドが複数回呼び出されるのを防ぐにはどうすればよいでしょうか? この時点では Super() が必要です。Super は本質的に MRO 情報を内部的に記録するクラスです。 C3 アルゴリズムでは、同じクラスが 1 回だけ検索されるようにするため、最上位の親クラスのメソッドが複数回実行されるのを回避できます。上記のコードは次のように変更できます。

class A():
    def __init__(self):
        print('init A...')
        print('end A...')

class B(A):
    def __init__(self):
        print('init B...')
        super(B, self).__init__()
        print('end B...')

class C(A):
    def __init__(self):
        print('init C...')
        super(C, self).__init__()
        print('end C...')

class D(B, C):
    def __init__(self):
        print('init D...')
        super(D, self).__init__()
        print('end D...')

if __name__ == '__main__':
    D()
ログイン後にコピー

出力結果:

init D...
init B...
init C...
init A...
end A...
end C...
end B...
end D...
ログイン後にコピー

このときの呼び出し順序は、D->B->C->A であることがわかります。つまり、breadth-first トラバーサル方法が使用されます。

補足内容

Pythonのクラスは、classicクラスと呼ばれるクラスと、new styleクラスと呼ばれるクラスの2種類に分けられます。どちらも多重継承をサポートしていますが、継承の順序が異なります。

  • 新しいスタイル クラス: オブジェクトから継承されたクラス。 (例: class A(object))。breadth-first 検索 (つまり、最初に水平方向の検索、次に上方向の検索) を使用して継承されます。
  • クラシック クラス: オブジェクトを継承しないクラス。 (例: class A())、 Depth-first 検索メソッドを使用して継承します (つまり、最初に継承ツリーの左側に深く入り、次に戻り、右側を見つけます)。

Python 2.x には、クラシック クラスと新しいクラスの 2 種類のクラスがあります。 Python3.x には新しいスタイルのクラスがたくさんあります。

その他の Python 関連のチュートリアルについては、Python チュートリアル 列に注目してください。

以上がPython の多重継承におけるダイヤモンド継承の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

2時間のPython計画:現実的なアプローチ 2時間のPython計画:現実的なアプローチ Apr 11, 2025 am 12:04 AM

2時間以内にPythonの基本的なプログラミングの概念とスキルを学ぶことができます。 1.変数とデータ型、2。マスターコントロールフロー(条件付きステートメントとループ)、3。機能の定義と使用を理解する4。

Redisキューの読み方 Redisキューの読み方 Apr 10, 2025 pm 10:12 PM

Redisのキューを読むには、キュー名を取得し、LPOPコマンドを使用して要素を読み、空のキューを処理する必要があります。特定の手順は次のとおりです。キュー名を取得します:「キュー:キュー」などの「キュー:」のプレフィックスで名前を付けます。 LPOPコマンドを使用します。キューのヘッドから要素を排出し、LPOP Queue:My-Queueなどの値を返します。空のキューの処理:キューが空の場合、LPOPはnilを返し、要素を読む前にキューが存在するかどうかを確認できます。

Redisでサーバーを開始する方法 Redisでサーバーを開始する方法 Apr 10, 2025 pm 08:12 PM

Redisサーバーを起動する手順には、以下が含まれます。オペレーティングシステムに従ってRedisをインストールします。 Redis-Server(Linux/Macos)またはRedis-Server.exe(Windows)を介してRedisサービスを開始します。 Redis-Cli ping(Linux/macos)またはRedis-Cli.exePing(Windows)コマンドを使用して、サービスステータスを確認します。 Redis-Cli、Python、node.jsなどのRedisクライアントを使用して、サーバーにアクセスします。

ビジネスのニーズに応じてRedisメモリサイズを設定する方法は? ビジネスのニーズに応じてRedisメモリサイズを設定する方法は? Apr 10, 2025 pm 02:18 PM

Redisメモリサイズの設定は、次の要因を考慮する必要があります。データ量と成長傾向:保存されたデータのサイズと成長率を推定します。データ型:異なるタイプ(リスト、ハッシュなど)は異なるメモリを占めます。キャッシュポリシー:完全なキャッシュ、部分キャッシュ、フェージングポリシーは、メモリの使用に影響します。ビジネスピーク:トラフィックピークに対処するのに十分なメモリを残します。

Python vs. C:比較されたアプリケーションとユースケース Python vs. C:比較されたアプリケーションとユースケース Apr 12, 2025 am 12:01 AM

Pythonは、データサイエンス、Web開発、自動化タスクに適していますが、Cはシステムプログラミング、ゲーム開発、組み込みシステムに適しています。 Pythonは、そのシンプルさと強力なエコシステムで知られていますが、Cは高性能および基礎となる制御機能で知られています。

Redisメモリ構成パラメーターとは何ですか? Redisメモリ構成パラメーターとは何ですか? Apr 10, 2025 pm 02:03 PM

** Redisメモリ構成のコアパラメーターはMaxMemoryであり、Redisが使用できるメモリの量を制限します。この制限を超えると、Redisは、Maxmemory-Policyに従って除去戦略を実行します。これには、次のようになります。その他の関連パラメーターには、Maxmemory-Samples(LRUサンプル量)、RDB圧縮が含まれます

メモリに対するRedisの持続性の影響は何ですか? メモリに対するRedisの持続性の影響は何ですか? Apr 10, 2025 pm 02:15 PM

Redis Persistenceは余分なメモリを取り、RDBはスナップショットを生成するときに一時的にメモリの使用量を増加させ、AOFはログを追加するときにメモリを取り上げ続けます。影響要因には、データのボリューム、永続性ポリシー、Redis構成が含まれます。影響を緩和するために、RDBスナップショットポリシーを合理的に構成し、AOF構成を最適化し、ハードウェアをアップグレードし、メモリの使用量を監視できます。さらに、パフォーマンスとデータセキュリティのバランスを見つけることが重要です。

Redisのデータを読み取る方法 Redisのデータを読み取る方法 Apr 10, 2025 pm 07:30 PM

Redisのデータを読み取るには、次の手順に従うことができます。1。Redisサーバーに接続します。 2。(key)を使用してキーの値を取得します。 3.文字列値が必要な場合は、バイナリ値をデコードします。 4.使用(キー)を使用して、キーが存在するかどうかを確認します。 5。mget(キー)を使用して、複数の値を取得します。 6。タイプ(キー)を使用してデータ型を取得します。 7. Redisには、次のような他の読み取りコマンドがあります。すべてのキーを一致するパターンで取得し、カーソルを使用してキーを反復し、キー値を並べ替えます。

See all articles