Python のクラスプロパティ
1. クラスプロパティ
プロパティはクラスに属する変数です。これらは、クラスから作成された各オブジェクト(インスタンス)のデータを保持するために使用されます。
1.1 プロパティを持つクラスの作成例
以下の例では、__init__ メソッド内でプロパティを定義しています。
class Person:
def __init__(self, name, age):
self.name = name # nameプロパティ
self.age = age # ageプロパティ
p1 = Person("エミル", 36)
print(p1.name)
print(p1.age)2. プロパティへのアクセス
オブジェクトのプロパティには、「ドット記法(dot notation)」を使用してアクセスできます。
2.1 オブジェクトのプロパティにアクセスする例
class Car:
def __init__(self, brand, model):
self.brand = brand
self.model = model
car1 = Car("トヨタ", "カローラ")
print(car1.brand)
print(car1.model)3. プロパティの変更
オブジェクトのプロパティ値は、後から直接書き換えることが可能です。
3.1 ageプロパティを変更する例
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person("トビアス", 25)
print(p1.age) # 変更前: 25
p1.age = 26 # 値を更新
print(p1.age) # 変更後: 264. プロパティの削除
del キーワードを使用することで、オブジェクトから特定のプロパティを削除できます。
4.1 ageプロパティを削除する例
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person("ライナス", 30)
del p1.age # ageプロパティを削除
print(p1.name) # これは正常に動作します
# print(p1.age) # ここでアクセスするとエラー(AttributeError)が発生します5. クラスプロパティ vs インスタンスプロパティ
__init__() 内で定義されたプロパティは、各オブジェクトに属するインスタンスプロパティです。
一方、メソッドの外で定義されたプロパティはクラスプロパティと呼ばれ、そのクラスから生成されたすべてのオブジェクトで共有されます。
5.1 クラスプロパティとインスタンスプロパティの比較例
class Person:
species = "人間" # クラスプロパティ(すべてのインスタンスで共通)
def __init__(self, name):
self.name = name # インスタンスプロパティ(個別の値)
p1 = Person("エミル")
p2 = Person("トビアス")
print(p1.name) # エミル
print(p2.name) # トビアス
print(p1.species) # 人間
print(p2.species) # 人間6. クラスプロパティの変更
クラスプロパティをクラス名経由で変更すると、その変更はすべてのオブジェクトに影響を与えます。
6.1 クラスプロパティを書き換える例
class Person:
lastname = ""
def __init__(self, name):
self.name = name
p1 = Person("ライナス")
p2 = Person("エミル")
# クラスプロパティを更新
Person.lastname = "レフスネス"
print(p1.lastname) # レフスネス
print(p2.lastname) # レフスネス7. 新しいプロパティの追加
既存のオブジェクトに対して、動的に新しいプロパティを追加することも可能です。
7.1 オブジェクトに新しいプロパティを追加する例
class Person:
def __init__(self, name):
self.name = name
p1 = Person("トビアス")
# 定義外のプロパティを動的に追加
p1.age = 25
p1.city = "オスロ"
print(p1.name)
print(p1.age)
print(p1.city)注意: この方法で追加されたプロパティは、その特定のオブジェクトインスタンスにのみ存在します。クラスの他のオブジェクト(インスタンス)には追加されません。