クラスとオブジェクトの概要
クラス(Class)は、共通の属性と動作を持つオブジェクトの設計図です。クラスから作られる個々の実体をインスタンスまたはオブジェクトと呼びます。
メソッドはクラス内に定義された関数で、そのクラスのインスタンスに対して操作を行います。
クラス変数はクラス全体で共有される変数で、すべてのインスタンス間で同じ値を持ちます。
インスタンス変数は各オブジェクトごとに異なる値を持つことができ、通常はselfを用いてアクセス・代入されます。
継承(Inheritance)により、既存のクラス(親クラス)の機能を新しいクラス(子クラス)が引き継ぐことができます。「is-a」関係を表現するのに適しています。
子クラスでは親クラスのメソッドを上書き(オーバーライド)することも可能です。
クラスの基本構文
class ClassName:
# クラス本体
pass
クラスのインスタンス化と属性参照
クラスをインスタンス化することでオブジェクトを作成し、その属性やメソッドを利用できます。
class Example:
value = 100
def display(self):
return "Hello from method"
obj = Example()
print(obj.value) # 100
print(obj.display()) # Hello from method
self の役割
クラス内のメソッドの第1引数は、そのメソッドを呼び出したインスタンス自身を表します。慣例としてselfと命名されますが、任意の名前でも構いません。
class Identity:
def show(self):
print(f"インスタンス: {self}")
print(f"クラス: {self.__class__}")
inst = Identity()
inst.show()
コンストラクタ __init__
__init__はインスタンス生成時に自動的に呼び出される特殊メソッド(コンストラクタ)です。
class Point:
def __init__(self, x, y):
self.x_coord = x
self.y_coord = y
p = Point(3, 4)
print(p.x_coord, p.y_coord) # 3 4
メソッドの定義と利用
class Person:
def __init__(self, name, age, weight):
self.name = name
self.age = age
self.weight = weight
def introduce(self):
print(f"{self.name}は{self.age}歳で、体重は{self.weight}kgです。")
person = Person("Alice", 28, 55)
person.introduce()
単一継承とメソッドのオーバーライド
class Student(Person):
def __init__(self, name, age, weight, grade):
super().__init__(name, age, weight)
self.grade = grade
def introduce(self):
print(f"{self.name}は{self.age}歳で、{self.grade}年生です。")
s = Student("Bob", 12, 45, 6)
s.introduce()
親クラスのメソッドを呼び出すにはsuper()を使用するのが推奨されます。
多重継承
Pythonでは複数のクラスを同時に継承できます。メソッド解決順序(MRO)は左から右に探索されます。
class Speaker:
def __init__(self, name, topic):
self.name = name
self.topic = topic
def speak(self):
print(f"私は{self.name}。テーマは「{self.topic}」です。")
class Learner:
def __init__(self, name, level):
self.name = name
self.level = level
def speak(self):
print(f"{self.name}はレベル{self.level}の学習者です。")
class Presenter(Speaker, Learner):
def __init__(self, name, topic, level):
Speaker.__init__(self, name, topic)
Learner.__init__(self, name, level)
presenter = Presenter("Taro", "AI", 5)
presenter.speak() # Speakerのspeakが呼ばれる(左優先)
プライベート属性とメソッド
属性やメソッド名の先頭に二重アンダースコア(__)を付けると、外部からの直接アクセスが制限されます(名前マングリングによる擬似プライベート)。
class SecretKeeper:
def __init__(self):
self.public = "公開情報"
self.__private = "秘密情報"
def reveal(self):
return self.__private # 内部からはアクセス可能
keeper = SecretKeeper()
print(keeper.public) # OK
# print(keeper.__private) # エラー(直接アクセス不可)
print(keeper.reveal()) # 秘密情報
特殊メソッド(マジックメソッド)
クラスに特定の動作を定義するために使用される組み込みメソッドです。代表的なもの:
__init__: 初期化__del__: オブジェクト破棄時の処理__str__,__repr__: 文字列表現__len__:len()対応__add__,__sub__など: 演算子オーバーロード__call__: インスタンスを関数のように呼び出し可能に