Python __init__ コンストラクタ
コンストラクタ
コンストラクタは、インスタンスを作成したときに実行されるメソッド。
実際にインスタンスを作成したときに、その内容が実施されているかどうかを確かめてみる。
#main_1-1.py class Parent(): def __init__(self): print("こっちはインスタンスのprint") def PrintInfo(self): print("こっちはPrintInfoメソッド,print") TEST = Parent() TEST.PrintInfo() ''' [実行結果] こっちはインスタンスのprint こっちはPrintInfoメソッド,print '''
説明
インスタンスの作成文以外には
TEST.PrintInfo()
の1行しかない。
しかし、出力として
「こっちはインスタンスのprint」
「こっちはPrintInfoメソッド,print」
という具合に2行出力されている。
「こっちはインスタンスのprint」が出力されるのは、インスタンス作成時に
"__init__"がコンストラクタとして動作し、def内のprintが実行されているためである。
このようにコンストラクタはインスタンス作成時に動作する。
このコンストラクタを使って、インスタンスを作成したとき、そのインスタンスの初期値(引数)を設定する。
#main_1-2 class Parent(): def __init__(self,txt1): self.txt1 = txt1 print(str(txt1)) TEST = Parent("コンストラクタ!") ''' [実行結果] コンストラクタ! '''
python クラスの継承 オーバーライド
説明の前に
下記のプログラムだと、親であるParentクラスと子であるChildクラスは同じである。
#親クラス class Parent(): def PrintGreeting(self): print("どうもこんにちは。") def PrintWho(self): print("わたしは親です") #子クラス class Child(Parent): pass
オーバライド
子クラス独自の出力をさせるため、PrintWhoメソッドを書き換えて、表示する内容を変えてみる。
これを【オーバーライド】という。
下記の例では、オーバライドでPrintWhoメソッドを変更した後に表示結果を確認し、PrintWhoメソッドが書き換わっていることを確認する。
#main_1-1.py #親クラス class Parent(): def PrintGreeting(self): print("どうもこんにちは。") def PrintWho(self): print("わたしは親です。") #子クラス class Child(Parent): def PrintWho(self): #←オーバライド print("ぼくはこどもです。親ではありません。") suzuki_ichiro = Parent() #親クラスのオブジェクト suzuki_taro = Child() #子クラスのオブジェクト #内容確認 print("suzuki_ichiro.PrintGreeting():実行結果") suzuki_ichiro.PrintGreeting() print("suzuki_ichiro.PrintWho():実行結果") suzuki_ichiro.PrintWho() print("suzuki_taro.PrintGreeting():実行結果") suzuki_taro.PrintGreeting() print("suzuki_taro.PrintWho():実行結果") suzuki_taro.PrintWho() #オーバーライドした個所の確認 ''' 【実行結果】 suzuki_ichiro.PrintGreeting():実行結果 どうもこんにちは。 suzuki_ichiro.PrintWho():実行結果 わたしは親です。 suzuki_taro.PrintGreeting():実行結果 どうもこんにちは。 suzuki_taro.PrintWho():実行結果 ぼくはこどもです。親ではありません。 '''
上記の結果から、子クラスでPrintWhoメソッドを書き換えができていることがわかる。
また、オーバライドを行っていないPrintGreetingメソッドは、親メソッドのものと変わっていない。
python クラスの継承
クラスの継承
クラスの内容(メソッド、定義)は、子クラスに引き継ぐ(継承すること)ことができる。
引き継ぐためには、以下のように、子クラスの引数の中に親クラスの名前を入れでクラスを作成する。
以下、例。
#親クラス class Parent(): def PrintGreeting(self): print("どうもこんにちは。") def PrintWho(self): print("わたしは親です") #子クラス class Child(Parent): pass
次に、親クラス、子クラスのオブジェクトを作り、メソッドが子クラスに継承されていることを確認する。
#main_1-1.py #親クラス class Parent(): def PrintGreeting(self): print("どうもこんにちは。") def PrintWho(self): print("わたしは親です。") #子クラス class Child(Parent): pass suzuki_ichiro = Parent() #親クラスのオブジェクト suzuki_taro = Child() #子クラスのオブジェクト #内容確認 print("suzuki_ichiro.PrintGreeting():実行結果") suzuki_ichiro.PrintGreeting() print("suzuki_ichiro.PrintWho():実行結果") suzuki_ichiro.PrintWho() print("suzuki_taro.PrintGreeting():実行結果") suzuki_taro.PrintGreeting() print("suzuki_taro.PrintWho():実行結果") suzuki_taro.PrintWho() ''' 【実行結果】 suzuki_ichiro.PrintGreeting():実行結果 どうもこんにちは。 suzuki_ichiro.PrintWho():実行結果 わたしは親です suzuki_taro.PrintGreeting():実行結果 どうもこんにちは。 suzuki_taro.PrintWho():実行結果 わたしは親です '''
上記の結果から、子クラスでメソッドを再度定義しなくても継承されていることが分かる。
ただし、このままだと[親クラス]=[子クラス]となるので、分けた意味がないため[オーバーロード]などを使用して、
子クラスを親クラスと違った機能を持たせたりする。