Pythonでのクラスの基礎と実践例

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()

タグ: Python クラス 継承 オブジェクト指向 エンクロージャ

5月15日 19:50 投稿