【Python入門9】クラスとオブジェクト指向プログラミング
クラスとは
クラスは、オブジェクト指向プログラミングにおいて、オブジェクトを生成するための設計図となるものです。オブジェクトとは、プログラムの中で独立した存在として扱われるものであり、それぞれが持つ状態や振る舞いを定義することができます。
Pythonでは、クラスを定義することで、オブジェクトを生成することができます。クラスは、関数や変数をまとめたものであり、その中にはオブジェクトが持つ状態や振る舞いを定義するためのメソッド(関数)や属性(変数)が含まれます。
オブジェクト指向プログラミングとは オブジェクト指向プログラミングは、プログラムをオブジェクトの集合体として捉えるプログラミング手法です。オブジェクト指向プログラミングでは、オブジェクト同士が相互作用を行い、プログラム全体としての振る舞いを実現します。オブジェクト指向プログラミングでは、状態と振る舞いが一体となったオブジェクトを中心に、プログラムを設計・実装することができます。
クラスの定義
Pythonでは、クラスを定義するために、classキーワードを使用します。クラス名は、一般的に大文字で始めるキャメルケース(例:MyClass)が使われます。クラスの中には、initというメソッドが定義されます。このメソッドは、クラスのオブジェクトが生成されたときに呼び出され、オブジェクトの初期化を行うために使用されます。
class MyClass: def __init__(self, name): self.name = name def greet(self): print(f"Hello, {self.name}!") obj = MyClass("John") obj.greet() # 出力: "Hello, John!"
上記のコードは、MyClassというクラスを定義し、initメソッドでnameという属性を初期化しています。また、greetというメソッドを定義し、その中でname属性を使って挨拶をするようになっています。最後に、MyClassクラスのインスタンス(オブジェクト)を生成し、greetメソッドを呼び出しています。ここでは、引数に"John"を渡してオブジェクトを生成しています。
クラスの継承
クラスを定義する際、既存のクラスをベースに新しいクラスを定義することができます。これをクラスの継承と呼びます。継承するクラスを親クラス、新しく定義するクラスを子クラスと呼びます。子クラスは、親クラスの属性やメソッドを引き継ぐことができます。
class Person: def __init__(self, name): self.name = name def introduce(self): print(f"My name is {self.name}.") class Student(Person): def __init__(self, name, grade): super().__init__(name) self.grade = grade def introduce(self): super().introduce() print(f"I'm in grade {self.grade}.") student = Student("Tom", 2) student.introduce() # 出力: "My name is Tom. I'm in grade 2."
上記のコードでは、Personという親クラスを定義し、Studentという子クラスを定義しています。Studentクラスは、Personクラスを継承しています。Personクラスには、名前を表すname属性と、自己紹介するためのintroduceメソッドが定義されています。Studentクラスには、Personクラスの属性に加えて、学年を表すgrade属性が定義されています。また、introduceメソッドは、親クラスのintroduceメソッドを呼び出した後に、学年を出力するようになっています。最後に、Studentクラスのインスタンスを生成し、introduceメソッドを呼び出しています。
クラス変数とインスタンス変数 クラス内で定義された変数は、クラス変数とインスタンス変数の2種類に分類されます。クラス変数は、クラス自体に属し、すべてのインスタンスで共有される変数です。インスタンス変数は、各インスタンスごとに独立して存在する変数です。
class MyClass: class_var = "Hello" # クラス変数 def __init__(self, name): self.instance_var = name # インスタンス変数 obj1 = MyClass("John") obj2 = MyClass("Tom") print(obj1.class_var) # 出力: "Hello" print(obj2.class_var) # 出力: "Hello" print(obj1.instance_var) # 出力: "John"
上記のコードでは、MyClassというクラスを定義し、class_varというクラス変数とinstance_varというインスタンス変数を定義しています。クラス変数はクラス自体に属するため、すべてのインスタンスで共有されます。一方、インスタンス変数は、各インスタンスごとに独立して存在するため、値が異なることがあります。
メソッドの種類
Pythonでは、3種類のメソッドがあります。それぞれ、インスタンスメソッド、クラスメソッド、スタティックメソッドと呼ばれます。
インスタンスメソッド インスタンスメソッドは、オブジェクトから呼び出すメソッドです。インスタンスメソッドは、第1引数にselfを指定することで、オブジェクト自身を参照することができます。インスタンスメソッドは、オブジェクトが持つ状態を変更するために使用されることが多いです。
python Copy code class MyClass: def init(self, name): self.name = name
def greet(self):
print(f"Hello, {self.name}!")
obj = MyClass("John") obj.greet() # 出力: "Hello, John!" 上記のコードでは、MyClassというクラスを定義し、initメソッドでname属性を初期化しています。また、greetというメソッドを定義し、その中でname属性を使って挨拶をするようになっています。最後に、MyClassクラスのインスタンスを生成し、greetメソッドを呼び出しています。
クラスメソッド
クラスメソッドは、クラス自体から呼び出すメソッドです。クラスメソッドは、@classmethodというデコレータを指定することで、定義することができます。クラスメソッドは、第1引数にclsを指定することで、クラス自身を参照することができます。クラスメソッドは、クラスが持つ状態を変更するために使用されることが多いです。
class MyClass: class_var = 0 def __init__(self): self.instance_var = 0 @classmethod def add_class_var(cls, num): cls.class_var += num def add_instance_var(self, num): self.instance_var += num obj1 = MyClass() obj2 = MyClass() obj1.add_class_var(10) obj2.add_instance_var(10) print
上記のコードでは、MyClassというクラスを定義し、class_varというクラス変数とinstance_varというインスタンス変数を定義しています。クラスメソッドadd_class_varは、クラス変数を加算するために使用されます。インスタンスメソッドadd_instance_varは、インスタンス変数を加算するために使用されます。MyClassクラスのインスタンスobj1とobj2を生成し、それぞれクラスメソッドとインスタンスメソッドを呼び出しています。最後に、クラス変数とインスタンス変数の値を出力しています。
スタティックメソッド
スタティックメソッドは、クラスやインスタンスに依存しないメソッドです。スタティックメソッドは、@staticmethodというデコレータを指定することで、定義することができます。スタティックメソッドは、クラスが持つ関数を定義するために使用されることが多いです。
class MyClass: @staticmethod def say_hello(): print("Hello, World!") MyClass.say_hello() # 出力: "Hello, World!"
上記のコードでは、MyClassというクラスを定義し、say_helloというスタティックメソッドを定義しています。最後に、MyClassクラスのスタティックメソッドを呼び出しています。
まとめ
Pythonにおけるクラスとオブジェクト指向プログラミングについて、基本的な概念や構文、特徴について解説しました。Pythonのクラスとオブジェクト指向プログラミングは、非常に柔軟で強力な機能を持っています。クラスとオブジェクト指向プログラミングの理解は、より複雑なプログラムの開発に役立ちます。