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'>)

呼び出された順番と一致してますね。

詳細