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)
というコードから
オブジェクトが生成された
インスタンス変数が初期化された
というメッセージが出る。
クラスとオブジェクト
-
クラスとオブジェクトの基本|Python0335
-
Pythonのクラス0154
-
Pythonのオブジェクトはidが割り当てられている02232
-
Pythonで引数の型を指定(明示)する01216