基本概念

Pythonでクラス(Class)を定義する方法

スポンサーリンク

概要とサンプルコード

Pythonでクラスを定義するには、class キーワードを使用します。

以下に、クラスを定義する例を示します。

# クラスを定義する
class MyClass:
# クラス変数
class_variable = "class variable"
# コンストラクタ
def __init__(self, instance_variable):
# インスタンス変数
self.instance_variable = instance_variable
# インスタンスメソッド
def instance_method(self):
print(self.instance_variable)
# クラスメソッド
@classmethod
def class_method(cls):
print(cls.class_variable)
# スタティックメソッド
@staticmethod
def static_method():
print("static method")

上記のクラスでは、以下のような定義がされています。

クラス変数

クラス内で共通して使用される変数です。クラス変数は、インスタンス化されたオブジェクトから直接アクセスできます。

コンストラクタ

クラスのインスタンスを生成するときに呼び出される特殊なメソッドです。
コンストラクタは、インスタンス変数の初期化など、インスタンスを生成するときに必要な処理を行うために使用されます。

インスタンスメソッド

クラスのインスタンスから呼び出されるメソッドです。インスタンスメソッドは、インスタンス変数を参照することができます。

クラスメソッド

クラスから直接呼び出されるメソッドです。クラスメソッドは、クラス変数を参照することができます。
クラスメソッドは、デコレータ @classmethod を使用して定義します。

スタティックメソッド

スタティックメソッドは、クラス変数やインスタンス変数を参照することができません。
スタティックメソッドは、単独で使用されることが多く、クラスやインスタンスとは関係がないような処理を行うために使用されます。
スタティックメソッドは、デコレータ @staticmethod を使用して定義します。

使用例

以下に、上記のクラスを使用する例を示します。

# クラスのインスタンスを生成する
obj = MyClass("instance variable")
# インスタンスメソッドを呼び出す
obj.instance_method()  # "instance variable" が出力される
# クラスメソッドを呼び出す
MyClass.class_method()  # "class variable" が出力される
# スタティックメソッドを呼び出す
MyClass.static_method()  # "static method" が出力される

上記の例では、クラスのインスタンスを生成し、そのインスタンスからインスタンスメソッドを呼び出しています。
また、クラスからクラスメソッドやスタティックメソッドを直接呼び出しています。

注意点

Pythonでは、クラス内のメソッドは、必ず最初の引数に self を指定する必要があります。self は、呼び出されたメソッドを持つインスタンスを指します。

例えば、上記のクラスで定義されたインスタンスメソッド instance_method を呼び出すときには、次のようにします。

obj.instance_method()

このとき、instance_method メソッド内では、self が obj インスタンスを指します。つまり、self.instance_variable は、obj.instance_variable と同じです。

また、クラスメソッドやスタティックメソッドは、インスタンスから呼び出されることがありますが、最初の引数に self を指定する必要はありません。
クラスメソッドでは、最初の引数に cls を指定し、スタティックメソッドでは、引数を省略することができます。

例えば、上記のクラスで定義されたクラスメソッド class_method を呼び出すときには、次のようにします。

MyClass.class_method()

このとき、class_method メソッド内では、cls が MyClass クラスを指します。つまり、cls.class_variable は、MyClass.class_variable と同じです。

また、スタティックメソッド static_method を呼び出すときには、次のようにします。

MyClass.static_method()

スタティックメソッド内では、引数を指定する必要はありません。

上記の例では、クラスのインスタンスを生成し、そのインスタンスからインスタンスメソッドを呼び出しています。  
また、クラスからクラスメソッドやスタティックメソッドを直接呼び出しています。

その他の概念

そのほかにも、Pythonでは、以下のような概念があります。

継承: クラスは、他のクラスを継承することができます。継承することで、元となるクラスの機能を引き継ぐことができます。
ポリモーフィズム: 継承元と継承先で、同じ名前のメソッドを定義することで、異なる処理を行うことができます。
オーバーライド: 継承先で、継承元のメソッドを上書きすることができます。これを、メソッドのオーバーライドといいます。

例えば、以下のように、クラスを継承した例を示します。

# クラスを定義する
class BaseClass:
def method(self):
print("BaseClass.method")
# クラスを継承する
class SubClass(BaseClass):
def method(self):
print("SubClass.method")
# インスタンスを生成する
obj = SubClass()
# メソッドを呼び出す
obj.method()  # "SubClass.method" が出力される

上記の例では、BaseClass クラスを継承した SubClass クラスを定義しています。SubClass クラスでは、method メソッドをオーバーライドしています。そのため、obj.method() を呼び出すと、SubClass.method が出力されます。

もし、BaseClass クラスの method メソッドを呼び出したい場合は、次のようにします。

# インスタンスを生成する
obj = SubClass()
# メソッドを呼び出す
obj.method()  # "SubClass.method" が出力される
# 継承元のメソッドを呼び出す
obj.method(BaseClass)  # "BaseClass.method" が出力される

また、Pythonでは、以下のような構文を使用することで、クラスのインスタンスを生成することができます。

obj = クラス名()

例えば、以下のように、辞書型のクラスのインスタンスを生成することができます。

# クラスを定義する
class MyDict:
def __init__(self):
self.d = {}
# クラスのインスタンスを生成する
d = MyDict()
# インスタンスを使用する
d["key"] = "value"
print(d["key"])  # "value" が出力される

上記の例では、init メソッドは、クラスのインスタンスが生成されるときに自動的に呼び出されます。
このメソッドは、コンストラクタと呼ばれ、インスタンス変数の初期化など、インスタンスを生成するときに必要な処理を行うために使用されます。

コメント

タイトルとURLをコピーしました