Python コンストラクタとデストラクタ

Python学習【365日チャレンジ!】78日目のマスターU(@Udemy11)です。

AppleTVのサブスクリプションに登録したのですが、みられる映画がほとんどなくてがっかりしています。

見放題という認識をしていたのでAppleTVで提供されている映画は全て見放題だと思っていたのですが、オリジナルの動画のみが見放題になるとのことです。

Amazonプライムのプライムビデオなら、追加料金が必要な映画はあるものの、過去の作品はかなり見放題なので、AppleTVよりAmazonプライムビデオのほうがおすすめです。

映画が好きなので、かなりみている方ですが、興味をひかれる映画があったらついついみちゃうんですよね。

Python学習のあと、記事を書いて、時間があればおもしろそうな映画を探すのですが、ついつい寝不足になってしまいます。

それでは、今日もPython学習頑張りましょう!

昨日の復習

昨日は、クラスの初期化とクラスの変数について学習しました。
クラスの初期化については、最初に読み込まれるメソッドである__init__で指定しました。

また、メソッドの引数には必ずselfを指定しなければいけないので、第一引数は、selfに続けて記述します。

また、クラス内のメソッドは、クラス内の他のメソッドで使い回すことが可能でしたね。

class Person(object):
    def __init__(self, name):
        self.name = name

    def say_word(self):
        print('I am {}, Hi'.format(self.name))
        self.add_num(2, 4)

    def add_num(self, i, j):
        print(i * j)

person = Person('Jack')
person.say_word()

出力結果

I am Jack, Hi
8

__init__でクラスに名前を指定して、2つのメソッドsay_wordadd_numを定義しています。

say_wordの中にはself.add_num(2, 4)というクラス内のメソッドを使っています。

実際、こんな使い方ができますよという理解はしたものの、具体的な使い方がまだわかっていないので、実践していく中で慣れていくしかありませんね。

詳しくは、昨日の記事を参考にしてください。

それでは、本日の学習にはいりましょう!

コンストラクタとは

実はすでにコンストラクタを学習しています。

コンストラクタは、クラスのインスタンスを作ったときに最初にする初期化処理のことで、__init__の定義のことで、すでに学習していますが、def __init__(self):で定義します。

class Animal(object):
    def __init__(self, name, cry):
        self.animal_types = name
        self.cry = cry

    def say(self):
        print('The {} says {}'.format(self.animal_types, self.cry))

dog = Animal('Dog', 'Bow-Wow')
cat = Animal('Cat', 'Meow-Meow')

dog.say()
cat.say()

出力結果

The Dog says Bow-Wow
The Cat says Meow-Meow

このコードの場合、Animalクラスの種類と鳴き声の2つの引数を定義してコンストラクタを作成しています。

クラスのメソッドはsayだけですが、9行目、10行目でdogcatというクラスのインスタンスを作成しています。

ちなみに、【インスタンス】という言葉がはじめて登場しましたが、わかりやすく説明すると、こんな感じ。

  • クラス : 設計図
  • インスタンス : 設計図を元に作られた実物

クラスが設計図で実体がないのに対して、インスタンスは作られた実物で具体的に動かすことができるものと理解するとわかりやすいでしょう。

上記のコードで考えると、Animalという設計図に、具体的な種類と鳴き声を与えてできたものがdogcatという実体になります。

これまでの学習でもPersonという設計図を元に、personという実物を作っていたわけですね。

一つのクラスから2つのインスタンスを作っていますが、sayというメソッドは一つで、それぞれのインスタンスから引数を受け取っているので、同じメソッドを使っても結果は違うものになっています。

デストラクタとは

デストラクタは、コンストラクタとは逆で、作ったインスタンスが使われなくなったときにする処理の定義です。

class Animal(object):
    def __init__(self, name, cry):
        self.animal_types = name
        self.cry = cry

    def say(self):
        print('The {} says {}'.format(self.animal_types, self.cry))

    def __del__(self):
        print('finish')

cow = Animal('Cow', 'Moo-Moo')

cow.say()

出力結果

The Cow says Moo-Moo
finish

このコードでは、Animalクラスを元に、cowというインスタンスを作成していますが、cow.say()が実行されたあと、コードの記述がないため、この時点で、デストラクタ__del__(self)で定義した処理が実行され、cowインスタンスは削除されます

ちなみに14行目のcow.say()のあとに、print('still continue')
を付け加えると出力結果は次のようになります。

The Cow says Moo-Moo
still continue
finish

つまり、実行ファイルが閉じる際に行う処理を定義するのがデストラクタということです。

del文と同じ

クラスの中に記述するデストラクタですが、del文を使って呼び出すことができます。

class Animal(object):
    def __init__(self, name):
        self.name = name

    def say(self):
        print('Animal type is :', self.name)

    def __del__(self):
        print('finish')

cow = Animal('Cow')

cow.say()

del cow

print('still continue')

出力結果

Animal type is : Cow
finish
still continue

del cowによって、インスタンスが削除されるので、デストラクタで定義したfinishが先に出力されてから最後のstill continueが出力されます。

さらに最後の行に、cow.say()を加えたとしても、すでにcowが削除されているので、NameErrorが起こります。

一つ一つコツコツと

一気に難しいことをやってもなかなか理解することはできないので、設計図のパーツ一つ一つをきちんと理解していくことが大切です。

アリが巨大な巣を作り上げるように、慌てずコツコツと積み上げてしっかりとした土台を作っていきましょう。

それでは明日もGood Python!