生成AIと学ぶPython16: オブジェクト指向(クラスの基本: クラス、インスタンス、属性、メソッド)

ここからは、オブジェクト思考について説明していきます。
プログラムを一連の"オブジェクト"として考える設計思想やプログラミング手法のことです。オブジェクトは、データ(属性またはプロパティとも呼ばれる)とそれを操作する手続き(メソッドまたは関数とも呼ばれる)をカプセル化(包含)するもので、これによりデータと機能が結びつけられます。

今回は、オブジェクト指向の中でも最も基本的な内容である。
クラス、インスタンス、属性、メソッドについて説明します。

クラス

クラスとは、Pythonをはじめとするオブジェクト指向プログラミング言語において、オブジェクトを作成するための設計図のようなものです。クラスは、データ(属性)とそのデータを処理する関数(メソッド)をまとめたもので、オブジェクトの構造や振る舞いを定義します。

Pythonでクラスを定義するには、classキーワードを使用します。例えば、次のようにCarというクラスを定義できます。

class Car:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year

    def start_engine(self):
        print("Engine started.")

ここで、__init__メソッドは、インスタンスが生成される際に自動的に呼び出される特殊なメソッドで、コンストラクタと呼ばれます。start_engineメソッドは、エンジンを始動する振る舞いを表現しています。

インスタンス

インスタンスは、クラスから生成される具体的なオブジェクトのことを指します。クラスは設計図のようなものであり、その設計図から具体的な物体を作るのがインスタンスです。

クラスからインスタンスを生成するときには、通常、クラス名を関数として呼び出します。その際に必要に応じて引数を渡すこともできます。

以下はPythonでクラスからインスタンスを生成する例です。

class MyClass:
    def __init__(self, value):
        self.attribute = value

instance = MyClass(5)  # MyClassのインスタンスを生成

ここでは、MyClassというクラスからinstanceというインスタンスを生成しています。MyClassクラスは__init__という特別なメソッドを持っており、これはインスタンスが生成されるときに自動的に呼び出されるメソッドです(このようなメソッドをコンストラクタと呼びます)。この例では、コンストラクタが引数valueを取り、その値をインスタンスのattributeという属性に設定しています。

インスタンスの属性やメソッドには、ドット.を使ってアクセスします。例えば、上記のinstanceattribute属性にアクセスするにはinstance.attributeとします。

属性

属性は、クラスまたはクラスのインスタンス(オブジェクト)が持つデータを指します。属性は、オブジェクトの状態を定義するために使用されます。
属性には、クラス変数とインスタンス変数という2つの主要な変数タイプがあります。これらは、定義される場所とアクセス方法によって区別されます。

インスタンス変数:これらの変数は、クラスのインスタンス(つまり、オブジェクト)に固有のものです。インスタンス変数は、それぞれのオブジェクトに対して異なる値を持つことができます。インスタンス変数は、通常、__init__メソッド内など、メソッド内でselfを用いて定義・利用します。

class MyClass:
    def __init__(self, value):
        self.instance_var = value  # インスタンス変数

obj1 = MyClass(10)
obj2 = MyClass(20)
print(obj1.instance_var)  # 10
print(obj2.instance_var)  # 20

クラス変数:クラス変数は、クラス定義の中で直接定義され、そのクラスのすべてのインスタンスで共有されます。つまり、クラス変数を変更すると、その変更はクラスのすべてのインスタンスに影響を与えます。

class MyClass:
    class_var = 10  # クラス変数

obj1 = MyClass()
obj2 = MyClass()
print(obj1.class_var)  # 10
print(obj2.class_var)  # 10

MyClass.class_var = 20
print(obj1.class_var)  # 20
print(obj2.class_var)  # 20

この例でわかるように、クラス変数はすべてのインスタンスで共有されるのに対し、インスタンス変数は各インスタンスで独立しています。したがって、それぞれの用途によって適切な変数タイプを選択することが重要です。

メソッド

メソッドはクラス内に定義された関数を指します。メソッドは、特定のクラスのインスタンス(つまり、オブジェクト)に関連付けられ、そのオブジェクトの属性や他のメソッドにアクセスできます。

メソッドは主に次の3つの種類に分類されます。

インスタンスメソッド: これらのメソッドは、クラスのインスタンスに対して動作し、インスタンス属性にアクセスできます。インスタンスメソッドは最初の引数としてselfを取り、これはメソッドが呼び出されたインスタンスを参照します。

class MyClass:
    def instance_method(self):
        return "This is an instance method"

obj = MyClass()
print(obj.instance_method())  # "This is an instance method"

クラスメソッド: これらのメソッドは、クラスに対して動作し、クラス属性にアクセスできます。クラスメソッドは@classmethodデコレータで装飾され、最初の引数としてclsを取り、これはメソッドが呼び出されたクラスを参照します。

class MyClass:
    class_attribute = "This is a class attribute"
    
    @classmethod
    def class_method(cls):
        return cls.class_attribute

print(MyClass.class_method())  # "This is a class attribute"

静的メソッド: これらのメソッドは、インスタンスやクラスの属性にアクセスする能力を持たず、クラスのコンテキストに束縛されない普通の関数として動作します。静的メソッドは@staticmethodデコレータで装飾されます。

class MyClass:
    @staticmethod
    def static_method():
        return "This is a static method"

print(MyClass.static_method())  # "This is a static method"

これらのメソッドは、オブジェクトの振る舞いを定義します。

この記事が気に入ったらサポートをしてみませんか?