【Python】親クラスを取得する方法

親クラスを取得する方法

こんにちは、にわこまです。

今回は、pythonで子クラスから親クラス名を取得する方法を紹介します。クラスをたくさん作り継承も行うと、どのクラスがどのクラスを継承しているか分からなくなってしまうことがあると思います。そんな問題を解決します。

 

誤字脱字や分からない点がございましたらご連絡お願いいたします。

メールまたはTwitterのDMまで!

 

 

スポンサードサーチ


親クラスを取得する方法

1.クラス.__class__.__base__

2.クラス.__class__.__bases__

 

以上の2つの方法で親クラスを取得することができます。

 

1つ目の方法では、1つの親クラスを取得することができます。

2つ目の方法では、親クラスを全て取得することができます。

 

そもそも子クラスとは、継承しているクラスのことです。親クラスとは、継承されているクラスのことです。以下のコードに具体例を示します。

class A:
    pass

class B(A):
    pass

 

クラスB(継承しているクラス)が子クラスであり、クラスA(継承されているクラス)が親クラスとなります。

 

 

詳しい使い方を以下に示します。

 

 

「クラス.__class__.__base__」の使い方

「クラス.__class__.__base__」を使用した親クラスを表示するコードと実行結果を以下に示します。

class A:
    pass

class B(A):
    pass

if __name__ == '__main__':
    b = B()
    print(b.__class__.__base__)


#=== 実行結果 ===
<class '__main__.A'>

 

クラスAを親に持つ子クラスBを作成します。

8行目にて、クラスBのインスタンスを生成します。

9行目では、生成したインスタンスに対して「__class__.__base__」を行うことで親クラスを取得し、表示しています。

 

以上によって親クラスを1つ取得することができます。

 

 

「クラス.__class__.__bases__」の使い方

「クラス.__class__.__bases__」を使用した親クラスを表示するコードと実行結果を以下に示します。

class A:
    pass

class B:
    pass

class C(A, B):
    pass

if __name__ == '__main__':
    c = C()
    print(c.__class__.__bases__)


#=== 実行結果 ===
(<class '__main__.A'>, <class '__main__.B'>)

 

クラスAとクラスBを親に持つ子クラスCを作成します。

11行目にて、クラスCのインスタンスを生成します。

12行目では、生成したインスタンスに対して「__class__.__bases__」を行うことで親クラスを全て取得し、表示しています。

 

以上より、全ての親クラスを取得することができます。

  

・以上のコードのクラスCに対して「__class__.__base__」を行うとクラスAのみしか取得することができません。
・親クラスの親クラスを取得する特殊フィールドはありません。(特殊フィールドとは今回使用した「__class__」や「__base__」、「__bases__」などのこと)

 

 

親クラスの親クラスを取得する方法

以上で紹介した方法では親クラスまでしか取得できません。

そのため体系的に子クラス、親クラス、祖父母クラス(親クラスの親クラス)、曾父母クラス(親クラスの親クラスの親クラス)、、、を表示する関数を作成しました。

 

関数を作成するにあたり、以下の記事を参考にさせていただきました。

 

体系的にクラスを表示する関数とその実行結果を以下に示します。

class A:
    pass

class B(A):
    pass

class C(B):
    pass

def treeCls(cls, layer=0, is_last=False, indent_current=" "):
    # 参考させていただいた記事(ほぼパクりました)
    # https://qiita.com/horisuke/items/389ec60407b3baf45f25
    # フォーマットを定義
    fmt = "{indent}{branch}<{clsname}>"

    # カレントクラスの表示
    current = cls.__class__.__name__    # 現在のクラスの名前
    if(layer == 0):
        print("<" + current + ">")
    else:
        branch = "└ " if is_last else "├ "
        print(fmt.format(indent=indent_current, branch=branch, clsname=current))

    # 親クラスを取得
    parents = cls.__class__.__bases__

    # 最後のクラスか確認
    def is_last_cls(i):
        return i == len(parents) - 1

    # 再帰処理
    for i, P in enumerate(parents):
        p = P()
        indent_lower = indent_current
        if layer != 0:
            indent_lower += "   " if is_last else "│ "

        if(p.__class__.__base__.__name__ == "object"):      # 親クラスが基底クラスのobjectである場合
            branch = "└ " if is_last_cls(i) else "├ "
            print(fmt.format(indent=indent_lower, branch=branch, clsname=p.__class__.__name__))
        else:
            treeCls(p, layer=layer+1, is_last=is_last_cls(i), indent_current=indent_lower)

if __name__ == '__main__':
    b = B()
    treeCls(b)

    c = C()
    treeCls(c)


#=== 実行結果 ===
<B>
 └ <A>
<C>
 └ <B>
    └ <A>

 

ご利用になりたい方は以下からダウンロードをお願いします。

  

・基底クラスであるobjectクラスは表示しないようにしてあります。

  

 

まとめ

まとめの画像

今回は、子クラスから親クラス名を取得する方法を紹介しました。クラスをたくさん作り、クラス関係が複雑になったときに役に立ちます。

また、親クラスの親クラスを表示するための関数を紹介しました。

  

改めて親クラスを取得する方法を示します。

1.クラス.__class__.__base__

2.クラス.__class__.__bases__

 

1つ目の方法は、1つの親クラスを取得する方法です。

2つ目の方法は、全ての親クラスを取得する方法です。

 

 

最後までお読みいただきありがとうございました。

 

参考


スポンサードサーチ