3
5

More than 3 years have passed since last update.

super()についてハッキリさせる

Last updated at Posted at 2020-09-15

概要

pythonのクラス継承を行うsuper()、スーパークラスについて出てくるたびに調べ直していたので、使用方法をハッキリさせようと思う

用途

super()とは

親クラスを継承する用途で使用する
継承されるクラスを継承するクラスの引数にとる

class Parent():
    def __init__(self, plus):
        self.min = 20
        self.plus = plus

    def plus(self):
        age = self.min + self.plus
        return age

#親クラスのParentを引数にとることで継承する
class Child(Parent):
    def __init__(self):
        self.plus = 8

この状態でChild().plus()をしてもclass Parent__init__が上書きされてしまう(self.minが無くなる)ため、エラーとなってしまう

つまり、以下のようにイメージだ

class Parent():
    def __init__(self, plus):
        self.min = 20
        self.plus = plus

    def plus(self):
        age = self.min + self.plus
        return age

class Child(Parent):
    def __init__(self):
        self.plus = 8

    def plus(self):
        age = self.min + self.plus
        return age

従って、下記のようにすると親クラスのの__init__を継承するワケだ

class Parent():
    def __init__(self, plus):
        self.min = 20
        self.plus = plus

    def plus(self):
        age = self.min + self.plus
        return age

#ここでの引数plusは関数のplusではなく、親クラスの__init__の引数のplus
class Child(Parent):
    def __init__(self):
        super().__init__(plus)
        self.plus = 8

self.minの値は継承され、28という値を出力できる

super()の後は__init__か?

super()の後は__init__でなくてはいけないワケではなく、親クラスのメソッドであれば良い

class Parent():
    def message(self, text):
        print('your name is: {}'.format(text))

class Child(Parent):
    def message(self):
        print('your friend is: {}'.format(text))
        super().message(text)    

文法

super()内の引数について

python2系と3系で異なる

  • python2系
    super(親クラス名, self).親クラスのメソッド

  • python3系
    super().親クラスのメソッド

上記が標準のようだ

__init__()内の引数について

先ほどの例にコメントで記載した

class Parent():
    def __init__(self, plus):
        self.min = 20
        self.plus = plus

    def plus(self):
        age = self.min + self.plus
        return age

class Child(Parent):
    # selfに加えて、super()のinit()内で使われている引数を記載、引数の追加も可能
    def __init__(self, plus):
        # init()内はselfは省略して良い、デフォルト変数も省略可*、親クラスのinitと引数の数を揃える
        super().__init__(plus)
        self.plus = 8

※今回はデフォルト変数は使用していない

つまり、子クラスに関して

  • def __init__(引数)の引数は

    • selfを記載
    • super()のinit()内で使われている引数を記載
    • 引数の追加も可能
  • super().__init__(引数)の引数は

    • selfは書かない
    • 親クラスのinitと引数の数を揃える(selfを含む、ここでは2)
    • デフォルト変数は省略可能である

以上

3
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5