Pythonのクラスについて学んだ #2
はじめに
この記事は、python実践入門 6章 を読み終わった後の学習記録です。
学習段階のため、間違った知識を記述している可能性があります。
そのため、あまりこの記事を鵜呑みにせずに、できるだけ公式ドキュメント もしくは 書籍を読むことを推奨します。
また、間違った記述を発見した場合は、コメントにてご指摘いただけると幸いです。(誰でもコメント可)
クラスメソッド
class ClassName: @classmethod def class_method(cls): pass
このようにして、クラスメソッドを作成します。
@classmethod
を頭につけるだけですね。注意点としては、第一引数を必ずcls
にすることです。
第一引数には、クラスオブジェクトが渡されます。
継承
class Parallelogram: # Parallelogram(平行四辺形)クラスを定義。 pass class Rhombus(Parallelogram): # Parallelogram(平行四辺形)クラスを継承した Rhombus(菱形)クラスを定義 pass class Rectangle(Parallelogram): # Parallelogram(平行四辺形)クラスを継承した Rectangle(長方形)クラスを定義 pass class Square(Rhombus, Rectangle): # Rhombus(菱形)とRectangle(長方形)を継承した Square(正方形)クラスを定義 pass
継承の詳しい概要は、各自調べてください。(いい例が思い浮かばなかった。)
オーバーライド
class A: def greet(self, called_from): print(f"I'm A! Hello {called_from}") class B1(A): def greet(self, called_from): print(f"I'm B1! Hello {called_from}") super().greet('B1') B1().greet('Main')
このように、継承元のメソッドを継承先で書き換えることを、オーバーライドといいます。
継承先から、オーバーライドした継承元のメソッドを呼び出す際は、super().method()
と、書きます。
実行結果
I'm B1! Hello Main I'm A! Hello B1
多重継承 -ひし形継承問題-
class A: def greet(self, called_from): print(f"I'm A! Hello {called_from}") class B1(A): def greet(self, called_from): print(f"I'm B1! Hello {called_from}") super().greet('B1') class B2(A): def greet(self, called_from): print(f"I'm B2! Hello {called_from}") super().greet('B2') class C(B1, B2): def greet(self, called_from): print(f"I'm C! Hello {called_from}") super().greet('C') C().greet('Main')
さて、この場合はどのような実行結果になるでしょうか。実行してみましょう。
実行結果
I'm C! Hello Main I'm B1! Hello C I'm B2! Hello B1 I'm A! Hello B2
!?
この、菱形継承問題の詳しい解決方法は省きますが、あるアルゴリズムに従って、菱形のような継承を一つの線に治すという感じでしょうか。(よくわかってないため、鵜呑みにしないでください。)
詳細
そのアルゴリズムに従って、継承関係をタプルにしたものを、__mro__
メソッドによって取得できます。
C.__mro__
(<class '__main__.C'>, <class '__main__.B1'>, <class '__main__.B2'>, <class '__main__.A'>, <class 'object'>)
呼び出された順番と一致してますね。