クラスを継承させる(class inheritance)


概要



class クラス名(元のクラス名):
    クラスの内容

で継承クラスを定義できる


class aClass():
    def __init__(self,man01,man02):
        self.man01 = man01
        self.man02 = man02
    def aClassFunc1(self,man03):
        print(self.man01 + self.man02 + man03)

class aClassSub(aClass):
    def __init__(self,man01,man02,man04):
        self.man01 = man01
        self.man02 = man02
        self.man04 = man04
    def aClassFunc1(self,man03):
        print(self.man01 + self.man02 + man03 + self.man04)

ob1 = aClass('Bob','Ken')
print(ob1.man01)
print(ob1.man02)
ob1.aClassFunc1('Mike')

ob2 = aClassSub('Lin','Karen','Tanya')
print(ob2.man01)
print(ob2.man02)
ob2.aClassFunc1('Erie')

aCalssというクラスを以下に定義
    初期値(コンストラクタ)を以下に定義(引数はman01,man02)
        変数self.man01にman01(引数man01)の値を入れる
        変数self.man02にman01(引数man02)の値を入れる
    aClassFunc1という関数を以下に定義(引数はman03)
        「self.man01 + self.man02 + man03」を出力せよ

aClassSubというクラスをaClassの継承として定義
    初期値(コンストラクタ)を以下に定義(引数はman01,man02,man04)
        変数self.man01にman01(引数man01)の値を入れる
        変数self.man02にman01(引数man02)の値を入れる
        変数self.man04にman01(引数man04)の値を入れる
    aClassFuncという関数を以下に定義(引数はman03)
        「self.man01 + self.man02 + man03 + self.man04」を出力せよ

ob1にクラスaClassのインスタンスを初期値Bob,Kenで作成
ob01の変数man01を出せ
ob01の変数man02を出せ
ob01の関数aClassFunc1を引数Mikeで実行せよ

ob2にクラスaClassSubのインスタンスを初期値Lin,Karen,Taynaで作成
ob02の変数man01を出せ
ob02の変数man02を出せ
ob02の関数aClassFunc1を引数Erieで実行せよ

出力


Bob
Ken
BobKenMike
Lin
Karen
LinKarenErieTanya

説明


クラスを継承させると

元のクラスのプロパティ(変数)を増やしたり減らしたり
元のクラスのメソッド(関数)を増やしたり減らしたり

できる。クラス継承の使いどころとして
あるクラスの関数を使っているとき
その関数をちょっと変えて使いたいことがよく生じるときは
管理しやすくなって便利

継承したクラスaClassSubでは
コンストラクタを全て新しく書き直して全部上書きしている
関数も元の暮らすと同じ名前で定義すると
すべて上書きされる
何もしなければ上書きされず元のクラスの関数や変数などそのまま使える
上書きしたいものだけ上書きして使える

間違えやすい問題



概要


クラスを継承させるとき
元のクラスと同じ変数(プロパティ)や関数(メソッド)を使いたいときは
super()を使う


class aClass():
    def __init__(self,man01,man02):
        self.man01 = man01
        self.man02 = man02
    def aClassFunc1(self,man03):
        print(self.man01 + self.man02 + man03)

class aClassSub2(aClass):
    def __init__(self,man01,man02,man05):
        super().__init__(man01,man02)
        self.man05 = man05

ob1 = aClass('Bob','Ken')
print(ob1.man01)
print(ob1.man02)
ob1.aClassFunc1('Mike')

ob2 = aClassSub2('Lin','Karen','Tanya')
print(ob2.man01)
print(ob2.man02)
print(ob2.man05)
ob2.aClassFunc1('Erie')

aCalssというクラスを以下に定義
    初期値(コンストラクタ)を以下に定義(引数はman01,man02)
        変数self.man01にman01(引数man01)の値を入れる
        変数self.man02にman01(引数man02)の値を入れる
    aClassFunc1という関数を以下に定義(引数はman03)
        「self.man01 + self.man02 + man03」を出力せよ

aClassSub2というクラスをaClassの継承として定義
    初期値(コンストラクタ)を以下に定義(引数はman01,man02,man05)
        元のクラスで定義されていた変数をそのまま使う宣言
        変数self.man05にman05(引数man05)の値を入れる

ob1にクラスaClassのインスタンスを初期値Bob,Kenで作成
ob01の変数man01を出せ
ob01の変数man02を出せ
ob01の関数aClassFunc1を引数Mikeで実行せよ

ob2にクラスaClassSub2のインスタンスを初期値Lin,Karen,Taynaで作成
ob02の変数man01を出せ
ob02の変数man02を出せ
ob02の変数man05を出せ
ob02の関数aClassFunc1を引数Erieで実行せよ

出力


Bob
Ken
BobKenMike
Lin
Karen
Tanya
LinKarenErie

説明


継承したクラスaClassSub2で
コンストラクタを全て新しく上書きするのは面倒なので
super().__init__(man01,man02)と書けば
元のクラスのすべての変数を宣言したことになるので便利
この宣言はselfがいらないので注意

間違えやすい問題