概要
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)
- デフォルト変数は省略可能である
以上