継承の親子関係を確認するメソッド

Pythonの基本文法は覚えたので簡単なGUIソフトを作ってみたんですが、できあがったのはクラスを使った構造型プログラムでした。クラス図描いたり色々頑張ったのに、気がついたらひとつのメソッドにだらだら処理を書いていました。

これじゃいけないと思い、以前買った速習Python中で勉強しています。レベル的には入門書の次に読む本ですね。初級者に中級者の入り口あたりまでを橋渡ししてくれる感じです。

kindleの自費出版本でお値段は800円とこの手の本ではかなり安い部類。オブジェクト指向の基礎となる考え方、関数型プログラミングの深堀り、エラー処理と初級者がよくわからないままになっているところを解説してくれています。今の私のレベルにかなり合致した本で勉強になりました。ただ、ソースコードがなぜかダウンロードできないです。著者のWebページにいってもリンクがありませんでした。そこがマイナスといえばマイナスですが、コンパクトなコードで解説が丁寧なので、ダウンロードできなくても本を読み進めるにあたって支障はないと思います。

さて、この本で気になった箇所を備忘録的にアウトプットしていこうと思います。サンプルコードは著作権のことを考えて少しアレンジを加えて書いていきます。

継承したクラスの作成

今回のテーマはタイトルにもあるとおり、「継承の親子関係を確認するメソッド」です。親子関係を確認するには、当然継承されたクラスが必要になります。まずはそれを書きます。

class ClassA:
    pass
#クラスAを継承
class ClassB(ClassA):
    pass
#クラスBを継承
class ClassC(ClassB):
    pass
#クラスAを継承
class ClassD(ClassA):
    pass

 

クラス図にするとこんな感じです。

子クラスの確認

組込み関数issubclassを使って確認できます。

issubclass(A,B)でAはBのサブクラスかどうかを調べます。真ならTrueを偽ならFalseを返します。

 

print( issubclass( ClassB, ClassA)) 
#True
print( issubclass( ClassC, ClassA)) 
#True
print( issubclass( ClassD, ClassB)) 
#False

クラス図からも明らかなようにClassCはClassAのサブクラスClassBのサブクラスです。それもissubclass関数ではTrueを返します。

インスタンス

インスタンスにはtype()関数を使うことで親子関係を確認できます。

a = ClassA() 
b = ClassB() 
print( issubclass( type( b), type( a)))
#True

 

親クラスの確認

今度は逆にサブクラスから親クラスを確認するには__base__を使います。

print(ClassA.__base__)
#<class 'object'>
print(ClassB.__base__)
#<class '__main__.ClassA'>
print(ClassC.__base__)
#<class '__main__.ClassB'>

ClassAは親クラスを持たないのでobjectと表示されます。クラス自体もオブジェクトの一種で最上位のクラス「ClassA」は「object」を継承したクラスということになるらしいです。

インスタンス

インスタンスの場合には先ほどと同じでtype関数を使います。
また、__class__をつかってクラスを取得して__base__を使う方法もあります。

b = ClassB()
print(type(b).__base__)
#<class '__main__.ClassA'>
print(b.__class__.__base__)
#<class '__main__.ClassA'>

まとめ

IDEなどで大きめなプログラムを作っていて継承関係を確認したい時に便利そうですね。わたしはIDEはSpyderを使っています。Spyderにはpython consoleがあり、簡単な命令をうてます。そういったところでちからを発揮しそうな関数でした。

コメント