1 基本的なクラスの定義
class Dog():
"""小型犬を模倣するためのシンプルなクラス"""
def __init__(self,name,age):
"""名前と年齢の属性を初期化"""
self.name = name
self.age = age
def sit(self):
print(f"{self.name.title()} is now sitting.")
def roll_over(self):
print(f"{self.name.title()} rolled over")
my_dog = Dog('willie',6)
print(f"My dog's name is {my_dog.name.title()}.")
print(f"My dog is {str(my_dog.age)} years old.")
my_dog.sit()
my_dog.roll_over()
__init__メソッドはコンストラクタとして機能し、selfパラメータはインスタンス自身を指す。関数定義にはselfを明示的に記述するが、呼び出し時には自動的に渡される。
2 クラスから複数のインスタンス生成
class Dog():
"""小型犬を模倣するためのシンプルなクラス"""
def __init__(self,name,age):
"""名前と年齢の属性を初期化"""
self.name = name
self.age = age
def sit(self):
print(f"{self.name.title()} is now sitting.")
def roll_over(self):
print(f"{self.name.title()} rolled over")
my_dog = Dog('willie',6)
print(f"My dog's name is {my_dog.name.title()}.")
print(f"My dog is {str(my_dog.age)} years old.")
my_dog.sit()
my_dog.roll_over()
your_dog = Dog('lucy',3)
print(f"Your dog's name is {your_dog.name.title()}.")
print(f"Your dog is {str(your_dog.age)} years old.")
3 クラスの応用例
class Car():
"""車両を模倣するためのシンプルなクラス"""
def __init__(self,make,model,year):
"""基本属性の初期化"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
def get_descriptive_name(self):
"""車両情報を整えた形式で返却"""
long_name = f"{self.year} {self.make} {self.model}"
return long_name.title()
def read_odometer(self):
"""走行距離を表示"""
print(f"This car has {str(self.odometer_reading)} miles on it")
def update_odometer(self,mileage):
self.odometer_reading = mileage
def increment_odometer(self,miles):
self.odometer_reading += miles
def fill_gas_tank(self):
print("This car doesn't need a gas tank")
my_new_car = Car('audi', 'a4' ,'2016')
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()
my_new_car.odometer_reading=23
my_new_car.read_odometer()
my_new_car.update_odometer(36)
my_new_car.read_odometer()
my_new_car.increment_odometer(100)
my_new_car.read_odometer()
初期値の設定や属性の直接変更が可能。複数の操作方法の確認が可能。
4 クラスの継承
class ElectricCar(Car):
"""電気自動車の特徴を表すサブクラス"""
def __init__(self, make, model,year):
"""親クラスの初期化"""
super().__init__(make,model,year)
self.battery_size = 70
def describe_battery(self):
print(f"This car has a {str(self.battery_size)}-kwh battery.")
def fill_gas_tank(self):
print("This is OK!")
my_tesla = ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
my_tesla.fill_gas_tank()
親クラス(Car)のメソッドをオーバーライド可能。super()キーワードで親クラスの初期化処理を呼び出す。
5 複雑な構造のクラス設計
class Battery():
def __init__(self,battery_size=70):
"""バッテリー属性の初期化"""
self.battery_size = battery_size
def describe_battery(self):
"""バッテリー容量を表示"""
print(f"This car has a {str(self.battery_size)}-kwh battery.")
def get_range(self):
if self.battery_size == 70:
range = 240
elif self.battery_size == 85:
range = 270
message = f"This car can go approximately {str(range)}"
message += " miles on a full charge"
print(message)
class ElectricCar(Car):
"""電気自動車の特徴を表すサブクラス"""
def __init__(self, make, model,year):
"""親クラスの初期化"""
super().__init__(make,model,year)
self.battery = Battery()
my_tesla = ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()