Irohabook
0
321

Pythonのクラスとオブジェクト:インスタンスメソッドと__init__を理解する

Python のインスタンスメソッドとは、いわゆる通常のメソッドで self を第一引数とする。他のサイトや書籍ではインスタンスメソッドを単にメソッドと呼んでいるが、最初は「インスタンスメソッド」と厳密に呼ぶようにしよう。

class Book:
    def __init__(self, price, quantity):
        self.price = price
        self.quantity = quantity
        self.sale = 0


book = Book(300, 4)
print(book.sale)
# 0

上の Book クラスは本の価格、個数、売上に関するクラスである。コードの init という関数の引数を見てみよう。最初の引数は self になっている。だから init はインスタンスメソッドである。

別のインスタンスメソッドを追加してみよう。

class Book:
    def __init__(self, price, quantity):
        self.price = price
        self.quantity = quantity
        self.sale = 0

    def get_sale(self):
        self.sale = self.price * self.quantity


book = Book(300, 4)
print(book.sale)
# 0

book.get_sale()
print(book.sale)
# 1200

get_sale もインスタンスメソッドである。

インスタンスメソッドである get_sale を呼び出す前と後で sale の値が変わっていることに注意しよう。最初は get_sale を呼んでいないため sale は 0 である。なぜなら init で sale を 0 としているからだ。

get_sale を呼ぶと

self.sale = self.price * self.quantity

が実行されて sale に 1200 が入る。

Python のインスタンスメソッドは self を変える関数である

インスタンスメソッドもただの関数である。この関数はオブジェクト自身を変える。だから常に self を引数とする。

init は特殊なインスタンスメソッドである。オブジェクトが宣言されたときに動く。

実は init あたりが Python で一番理解しにくいところである。アンダーバーが 2 つ並んだ init というインスタンスメソッドは、オブジェクトを宣言するときに自動的に動く。

class Book:

    def __init__(self, price, quantity):
        print('オブジェクトが生成された')
        self.price = price
        self.quantity = quantity
        self.sale = 0
        print('インスタンス変数が初期化された')

    def get_sale(self):
        self.sale = self.price * self.quantity


book = Book(300, 4)

print('Apple')
print(book.sale)

コンソール画面にはこう出力される。

オブジェクトが生成された
インスタンス変数が初期化された
Apple
0

オブジェクト book が宣言されたときに init が動くため

book = Book(300, 4)

というコードから

オブジェクトが生成された
インスタンス変数が初期化された

というメッセージが出る。

次の記事

クラスとオブジェクト