Python 速習チュートリアル

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) # 変更後: 26

4. プロパティの削除

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)

注意: この方法で追加されたプロパティは、その特定のオブジェクトインスタンスにのみ存在します。クラスの他のオブジェクト(インスタンス)には追加されません。