Pythonのsuperメソッドを使ってクラスの継承を行う方法

スポンサーリンク
スポンサーリンク

イントロダクション

この記事では、Pythonのsuper()メソッドについて説明します。

このトピックに入る前に、Pythonの継承に関するチュートリアルに目を通しておくことを強くお勧めします。

Pythonの継承について理解した上で、このチュートリアルを始めることができます。

Python の super() メソッド

super` メソッドは、メソッド呼び出しを型の親クラスまたは兄弟クラスに委譲するプロキシオブジェクトを返します。

これは、クラス内でオーバーライドされた継承メソッドにアクセスするのに便利です。

また、コンストラクタ、つまりスーパークラスの __init__() メソッドを呼び出すために使用されます。

Pythonでsuperを使用するための構文は以下の通りです。

super([type[, object-or-type]])

Python 3.xでは、上記の2つのパラメータを渡さずにsuperを使用することができます

以下のコードを見てください。

class C(B):
    def method(self, arg):
        super().method(arg)

ここで、Cは派生クラス、Bは基底クラス、methodはユーザー定義関数で引数はargです。

Python 3.x では super().method(arg) という行は super( C, self).method(arg) と同じ意味になります。

super() を使う

次のような例を考えてみましょう。

class Demo:
    a = 0
    b = 0
    c = 0
    def __init__(self,A,B,C):
        self.a = A
        self.b = B
        self.c = C
    def display(self):
        print(self.a, self.b, self.c)
 
class Newdemo(Demo):
    d = 0
    def __init__(self,A,B,C,D):
        self.a = A
        self.b = B
        self.c = C
        self.d = D
 
    def display(self):
        print(self.a, self.b, self.c,self.d)
 
B1 = Demo(100,200,300)
print("Contents of Base Class:")
B1.display()
D1 = Newdemo(10,20,30,40)
print("Contents of Derived Class:")
D1.display()

結果を出力すると、以下の様になります。

class Demo:
    a = 0
    b = 0
    c = 0
    def __init__(self,A,B,C):
        self.a = A
        self.b = B
        self.c = C
    def display(self):
        print(self.a, self.b, self.c)
 
class Newdemo(Demo):
    d = 0
    def __init__(self,A,B,C,D):
        self.d = D
        super().__init__(A,B,C) #super to call super Class
        #The __init__() Method
 
    def display(self):
        print(self.a, self.b, self.c,self.d)
 
B1 = Demo(12,34,56)
print("Contents of Base Class:")
B1.display()
D1 = Newdemo(11,22,33,44)
print("Contents of Derived Class:")
D1.display()

上の例では、基底クラス Demo から派生したクラスは、効率的かつ堅牢に実装されていません。

派生クラス Newdemo は、基底クラスの A, B, C フィールドの値を明示的に初期化しています。

ベースクラス Demo の同じフィールドを初期化する際にも、同じコードの重複が見つかります。

この処理は非効率的です。

このことは、サブクラスがスーパークラスのメンバにアクセスすることを許可されなければならないことを意味します。

したがって、サブクラスが直属のスーパークラスを参照する必要がある場合は、 super が登場することになります。

スーパークラスのコンストラクタを呼び出すSuper()

では、上記の例に対して super() メソッドを適用してみましょう。

super(Derived_Class_Name, self).__init__(Parameters_of_Super_Class_Constructor)

結果は以下の通りです。

class Demo(object):
...#other statements

ここでは、派生クラス Newdemo が引数 a, b, c を指定して super() を呼び出すと、ベースクラスである Demo のコンストラクタ __init__ が呼び出されます。

これにより、a, b, c の値が初期化されます。

したがって、Newdemo クラスはもはや値を自ら初期化することはありません。

Python 2.x での super の使い方

Python 2.x で super クラスのコンストラクタを呼び出す構文は以下のとおりです。

super(Newdemo,self).__init__(A,B,C) #super to call super Class
...        #The __init__() Method

したがって、上記の例をPython 2で使用する場合は、いくつかの小さな変更を行う必要があります。

まず、以下のように object を基底クラスに追加する必要があります。

Output1
Output

そして、スーパークラスを呼び出す際に、Newdemoself を渡すようにします。

このようにします。

Output
Output

なぜ super() が必要なのか

親クラスと子クラスからなる単一継承の場合、 super 関数を使用すると、親クラスを明示的に指定することなく暗黙的に参照することができます

これにより、コードの効率性、保守性、堅牢性が向上します。

次に、複数レベルの継承では、 super メソッドを使用して、直前のスーパークラスを暗黙的に参照することができます

これもまた、コードを理解しやすく、保守性の高いものにします。

まとめ

この記事では、Pythonのsuper()メソッドの概念とその使い方、必要性を理解しました。

さらに質問がある場合は、以下にコメントしてください。

参考文献

  • Python Super – Journal Dev Post,
  • Pythonの’super’は何をするのですか?- StackOverflowの質問です。
  • Python super – 公式ドキュメント.
タイトルとURLをコピーしました