pythonに慣れよう9 クラス

class Yamanote:
	pass

shinagawa = Yamanote()
shinagawa.city = "Minato-ku"
shinagawa.user = 370000
shinagawa.line = 24

shibuya = Yamanote()
shibuya.city = "Shibuya-ku"
shibuya.user = 3310000
shibuya.spot = "hachiko"

print(shinagawa.city)
print(shibuya.spot)

[vagrant@localhost python]$ python app.py
Minato-ku
hachiko

コンストラクタを使う。

class Yamanote:
	def __init__(self, city):
		self.city = city

shinagawa = Yamanote("Shinagawa-ku")
shibuya = Yamanote("Shibuya-ku")

print(shinagawa.city)
print(shibuya.city)

[vagrant@localhost python]$ python app.py
Shinagawa-ku
Shibuya-ku

クラス変数を呼び出す。

class Yamanote:
	count = 0
	def __init__(self, city):
		Yamanote.count += 1
		self.city = city

shinagawa = Yamanote("Shinagawa-ku")
shibuya = Yamanote("Shibuya-ku")
print(Yamanote.count)

ふむ。
[vagrant@localhost python]$ python app.py
2

メソッド

class Yamanote:
	count = 0
	def __init__(self, city):
		Yamanote.count += 1
		self.city = city
	def announce(self):
		print("This is " + self.city)

shinagawa = Yamanote("Shinagawa-ku")
shibuya = Yamanote("Shibuya-ku")

shinagawa.announce()
shibuya.announce()

わかるんだが、使っていかないと、慣れないね。
[vagrant@localhost python]$ python app.py
This is Shinagawa-ku
This is Shibuya-ku

@classmethod

class Yamanote:
	count = 0
	def __init__(self, city):
		Yamanote.count += 1
		self.city = city
	def announce(self):
		print("This is " + self.city)
	@classmethod
	def show_info(cls):
		print(str(cls.count) + "instances")

shinagawa = Yamanote("Shinagawa-ku")
shibuya = Yamanote("Shibuya-ku")

Yamanote.show_info()

あああああ
[vagrant@localhost python]$ python app.py
2instances

class のprivate, public

class Yamanote:
	def __init__(self, city):
		self.__city = city
	def announce(self):
		print("This is " + self.__city)

shinagawa = Yamanote("Shinagawa-ku")
shibuya = Yamanote("Shibuya-ku")

print(shinagawa.__city)

[vagrant@localhost python]$ python app.py
Traceback (most recent call last):
File “app.py”, line 12, in
print(shinagawa.__city)
AttributeError: Yamanote instance has no attribute ‘__city’
ほえ~

継承のsuperがうまくいかない。

class Yamanote:
	def __init__(self, spot):
		self.spot = spot
	def announce(self):
		print("Enjoy " + self.spot)

class Startup(Yamanote):
	def __init__(self, spot, company):
		super().__init__(spot)
		self.company = company
	def hello(self):
		print("What's up " + self.company)

harajyuku = Startup("takeshita","sm")
print(Harajyuku.spot)
Harajyuku.hello()

[vagrant@localhost python]$ python app.py
Traceback (most recent call last):
File “app.py”, line 16, in
harajyuku = Startup(“takeshita”,”sm”)
File “app.py”, line 11, in __init__
super().__init__(spot)
TypeError: super() takes at least 1 argument (0 given)
あ、python2系はエラーになるのね。。早くいってよ、もー

import math, random
print(math.pi)