かなり複雑そうな話をしましょう｡
MRO（メソッド・レゾリューション・オーダー）と呼ばれるものです｡
どういう意味ですか？
さて､ ここで一例をご紹介しましょう｡
例えば､ Aというクラスがあるとします｡ Aというクラスを継承するBというクラスは､ 全く何もしません｡
さらに､ Aを継承するクラスC､ そしてBとCを継承するクラスDがあります｡
つまり､ 全く何もしないクラスが2つあり､ さらに同じクラスオブジェクト属性を持つクラスAとクラスCがあるということです｡
そして､ この関係がどのようなものかを実際に描いてみました｡
DはBとCから多重継承され､ BとCはAから継承されることがわかりますね｡
また､ Amro（メソッド解決順序）とは､ このような複雑な継承構造を持つメソッドを実行する際に､ Pythonがどのメソッドを実行するかを決定するためのルールである｡
アムロとは､ こうして､ こうして､ こうして､ というルールです｡
そして､ それが実行すべき方法なのです｡
どういうことか､ お見せしましょう｡
例えば､ print dx dot numとしたいとします｡
ここで何が起こると思いますか？
これを移動させるか､ コメントアウトさせてください｡
これを実行したら､ 何が起こるかわかるかな？
実行」をクリックすると
もらえるの？
それは期待通りですか？
これに目を通そう｡
DDはBとCを継承しています｡
そして､ その人たちは私から受け継ぐのです｡
MRO（メソッド・レゾリューション・オーダー）は､ D､ b､ aにならないので､ 1つになるわけです｡
その代わり､ dになる｡
B.
C.
A.
うーん｡
もう少し考えてみよう｡
そしてミロは､ クラス間､ メソッド間､ 変数間､ 属性間で共通するものがある場合､ 何が最初に来るかと言っているだけなのです｡
何を選べばいいのか？
そして､ 実はこれを確認するのにいい方法があるんです､ ミロさん､ こうやって実行すればいいんです｡
偽の湖上走行｡
あれを見てください｡
これがこのクラスのオーダー､ あるいはマロです｡
ちょっと､ まずDを調べてみます､ と書いてある｡
電話する場合､ 例えばDドットネームやdドットナンバーとします｡
まずはメインドットDを確認します｡
そこで､ このクラスをチェックし､ 次にmain dot Bをチェックするので､ Bをチェックし､
Cをチェックするのです｡
そして､ aを確認する｡
そして最後に､ ベースクラスのオブジェクトをもう一度確認します｡
以前にも見たことがあります｡
Pythonのすべてのオブジェクトが継承する基本クラスです｡
つまり､ その順番でチェックされるわけです｡
さて､ これらをすべてパスすると
そして､ 「実行」をクリックします｡
エアーを用意する
D には numb という属性がありません｡ なぜなら､ このパスをすべて通過し､ ベースオブジェクトまでチェックしたのに num が見つからなかったからです｡
SWのTRみたいなことをしたら
実行」をクリックすると
これは､ 継承の連鎖を経て､ ベースとなるオブジェクトに辿り着くため､ うまくいくのです｡
そして､ ベースオブジェクトは実際にこれを持っているので､ エラーになることはありません｡
そして､ うん､ ダンダーの文字列を使うことができる｡
今すぐ
相続がなぜ混乱するのか､ アムロのようなことはなぜ避けたいのか､ 少なくとも意識しておくべきなのか､
素晴らしい例がありましたのでご紹介します｡
では､ このコードをコピーしてみましょう｡
そして､ これをすべて削除してしまいましょう｡
そして､ ちょっとしたゲームをするんです｡
さて､ この構文｡
このように見える｡
つまり､ これが今作ったものの継承モデルです｡
かなり混乱しそうですね？
だから､ ここでエムをやれば｡
そして､ MRO､ つまりMのメソッド解決順序を確認します｡
順番はどうなるんだろう？
ここでビデオを一時停止して､ 順番を当ててみてください｡
準備完了｡
mドットアムロをやってみよう｡
ちなみに､ もう一つの方法として､ ダンダーアムロを使って､ これを印刷しましょう｡
よし､ これを確認しよう｡
そこで､ まずはemです｡
いいかい？
彼をチェックし､ Bをチェックし､ Bをチェックする｡
そして､ Aを確認する｡
そこで､ ここでAをチェックし､ こっちで××をチェックし､ 次にyをチェックする｡
次にZ､ そしてクラスオブジェクト｡
それがあなたの推測ですか？
コードを見てみましょう｡
なぜこのような注文を？
さて､ この順番は､ パラメータを渡す方法によるもので､ AとZの前にbeが渡されていますね｡
ということは､ マロの順番は､ その後aになるということですね｡
でも､ ビーナの後に待っててね｡
今のは何？
さて､ BとAの次は､ クラスxです｡
なぜXがZより先に来たのか？
そこで､ Zにするのではなく､ これをもう少し大きくしてみましょう｡
Zと思われるところに行くのではなく､ X→Y→Z→オブジェクトと進んでいくのです｡
これは､ Miroを行う際に､ 深度探索と呼ばれるアルゴリズムを使っているためです｡
さて､ これは講座の範囲を超えていますが､ ご覧の通り､ かなり混乱します｡
そして実のところ､ PythonはMISOのルールを､ 以前のPythonの若いバージョンとは変えているのです｡
これもアップデートされたんですね｡
でも､ なぜこんなものを見せているかというと､ こんなものでは絶対にテストにならないからです｡
もし､ 継承がこのようになっているコードを書いているのなら､ これは複雑になりすぎていて､ 悪いコードを書いていると私は主張します｡
これらのクラスの内部で実際にコードを書いてもいないのに､ すでに混乱しているのです｡
つまり､ どういう順番で継承していくかを定義する方法として､ アムロがあるんですね｡
また､ MRO機能やDUNDARでいつでも確認することができます｡
しかし､ ここに持ってきたのは､ あなたを混乱させようとしているだけではありません｡
理由は､ 存在するからです｡
しかし､ このようなコード構成にするべきではありません｡
これは､ 野生では起きないということではありません｡
はい､ そうです｡
しかし､ 少なくとも､ このような問題が発生したときに､ 自分のコードをチェックし､ もしかしたらデバッグする方法があるのです｡
マロについて資料を置いておきます｡
もしあなたが本当に好奇心旺盛で､ このアルゴリズムがどのように機能し､ この順番が実際にどのように決定されるのかを本当に理解したいのであれば｡
しかし､ 重要なことは､ Pythonはメソッドや属性を呼び出すときに､ このように判断する仕組みになっているということです｡
こうやって､ 継承の階層を調べていくんです｡
わかりました｡
脳が痛くなっても大丈夫｡
私のところもそうです｡
一息ついて､ 次のビデオでお会いしましょう｡
バイバイ｡