Python の __init__ と self について

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 クラスは本の価格、個数、売上に関するクラスです。別のインスタンスメソッドを追加します。

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 が入ります。

self とはなにか?

self はそのクラスのオブジェクトをいいます。上のコードでは

book = Book(300, 4)

book がオブジェクトであり、self は book そのものをさします。

※ 初めて Python のクラスを勉強するときは、self をおまじないの単語と覚えてもいいと思います。

init は特殊なメソッドで、オブジェクトが宣言されたときに動く

init はオブジェクトを宣言するときに自動的に動きます。

class Book:

	def __init__(self, price, quantity):
		print('オブジェクトが生成された')

		self.price = price
		self.quantity = quantity

		print('インスタンス変数が初期化された')


book = Book(300, 4)

print('Start!')
print(book.sale)

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

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