Pythonの継承について
クラスとは
クラスとは変数と関数を一つにまとめたもの
こちらのコードでは、名前・年齢を指定する変数と、Print関数をセットにしている。
class SuperClass():
def __init__(self):
self.name ="Yamada"
self.age = 7
def hello(self):
print("My name is " + str(self.name))
print("I am " + str(self.age)+" year old")
man = SuperClass()
man.hello()
# My name is Yamada
# I am 7 year old
クラスを作成して名前と年齢の紹介を行っている。
initはクラスが実体化した時に同時に実行される処理です。
クラス内で直接名前と年齢をしているが、固定の名前と年齢では使い物にならないので、
名前と年齢を引数として渡せるようにする
class SuperClass():
def __init__(self,name,age):
self.name = name
self.age = age
def hello(self):
print("My name is " + str(self.name))
print("I am " + str(self.age)+" year old")
man = SuperClass("Tanaka",40)
man.hello()
# My name is Tanaka
# I am 40 year old
クラスを実体化する際に、ついで名前と年齢を渡せるように修正した。
次は年齢と名前だけでなく、職業も扱えるようにしたい。
単純にクラスに新しい機能を追記しても良いのだが、次は継承を利用してみる。
スーパークラスの機能を継承し、さらに新たな機能を追加したサブクラスを作成する。
# スーパークラス
class SuperClass():
def __init__(self,name,age):
self.name = name
self.age = age
def hello(self):
print("My name is " + str(self.name))
print("I am " + str(self.age)+" year old")
# サブクラス
class SubClass(SuperClass): #SuperClassを継承する
def __init__(self,name,age,job):
self.name = name
self.age = age
self.job = job
def job_intro(self):
print("I am a " + str(self.job))
man = SubClass("Tanaka",40,"Warrior")
man.hello()#スーパークラスの関数
man.job_intro()#サブクラスの関数
# My name is Tanaka
# I am 40 year old
# I am a Warrior
スーパークラスのhello関数にて、名前と年齢の紹介
サブクラスのjob_intro関数にて、職業の紹介をしている
なんとくだらない機能だろう
上の例ではスーパークラスが持っているinitの機能を丸ごと書き換えてしまっている。
(オーバーライドというらしい)
名前と年齢に関してはスーパークラスの機能をそのまま流用すればよいので、全てを書き換える必要はない。
# スーパークラス
class SuperClass(object):#objectを継承しなければならない(よくわかってない)
def __init__(self,name,age):
self.name = name
self.age = age
def hello(self):
print("My name is " + str(self.name))
print("I am " + str(self.age)+" year old")
# サブクラス
class SubClass(SuperClass): #SuperClassを継承する
def __init__(self,name,age,job):
super(SubClass,self).__init__(name,age)
self.job = job
def job_intro(self):
print("I am a " + str(self.job))
man = SubClass("Tanaka",40,"teacher")
man.hello()
man.job_intro()
下の記述がキモ
スーパークラスのinitを呼び出しています。
super(SubClass,self).__init__(name,age)
3.0以降のPythonならsuperの引数を省略可能
super().__init__(name, age)
まとめ
スーパークラスのinitを流用するsuper()の使い方の部分でかなりハマった。