質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Q&A

解決済

1回答

1269閲覧

菱形継承時の明示的クラス指定方法について

shirai

総合スコア1290

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

0グッド

0クリップ

投稿2019/12/28 09:47

python

1class A(object): 2 3 def primary_process(self): 4 print('A') 5 6 def say_this_func_name(self): 7 pass 8 9class B(A): 10 11 def first_process(self): 12 super().primary_process(self) 13 14 def say_this_func_name(self): 15 print('B') 16 17class C(A): 18 19 def first_process(self): 20 super().primary_process(self) 21 22 def say_this_func_name(self): 23 print('C') 24 25class D(B, C): 26 27 def __init__(self): 28 super().first_process() 29 30 def say_B(self): 31 super().say_this_func_name() 32 33 def say_C(self): 34 super().say_this_func_name() 35 36b = D() 37b.say_B() 38 39c = D() 40c.say_C()

A
B
A
C
と出力してほしいのですが、どうすればいいでしょうか。
引数を増やすなどの対応でも構いません。


ポイントは2点あります。

  • 菱形継承をしているが片方の関数しか呼ばない

first_processはB, C両方に定義されていますが、
どちらでもいいのでどちらか片方だけ発火してほしいです。

  • どちらから継承されているかを明示的に指定する

上記のプログラム内ではクラスD内においてsuper().say_this_func_name()とだけしていますが、
明示的にB側のものかC側のものを使用したいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

print(D.mro())とかすると、どのような継承になっているかがわかります。

[<class 'main.D'>, <class 'main.B'>, <class 'main.C'>, <class 'main.A'>, <class 'object'>]

なので、Cを呼び出したい場合、Bのsuperという意味で、super(B,self)
と呼ぶと良いらしいです。

python

1class D(B, C): 2 3 def __init__(self): 4 super().first_process() 5 6 def say_C(self): 7 super(B,self).say_this_func_name()

投稿2019/12/28 11:05

t_obara

総合スコア5488

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shirai

2019/12/28 11:08

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問