LoginSignup
0
2

More than 3 years have passed since last update.

Pythonクラスと継承

Last updated at Posted at 2020-03-08

Pythonの継承について

クラスとは

クラスとは変数と関数を一つにまとめたもの
こちらのコードでは、名前・年齢を指定する変数と、Print関数をセットにしている。

super.py
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()の使い方の部分でかなりハマった。

0
2
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
0
2