Python - クラス属性

こんにちは、夢を持つプログラマーたち!今日は、Pythonのクラス属性の興味深い世界に飛び込んでいきましょう。プログラミングが初めての方でも心配しないでください;私はこの旅をステップバイステップに导いていくので、私の教える年月の中で数えきれないほどの生徒たちにすでに导いてきたようにです。それでは、始めましょう!

Python - Class Attributes

クラス属性(変数)

クラス属性とは、クラスの特定のインスタンスではなく、クラス全体に属する変数です。それは、そのクラスのすべてのオブジェクトが共有する特性と考えてください。

簡単な例から始めましょう:

class Dog:
species = "Canis familiaris"

def __init__(self, name, age):
self.name = name
self.age = age

fluffy = Dog("Fluffy", 3)
buddy = Dog("Buddy", 5)

print(Dog.species)  # 出力: Canis familiaris
print(fluffy.species)  # 出力: Canis familiaris
print(buddy.species)  # 出力: Canis familiaris

この例では、speciesはクラス属性です。それはクラスの中に直接定義されていますが、いかなるメソッドの外にも置かれています。すべてのDogオブジェクトはこの属性を共有しています。

クラス属性へのアクセス

上記の例からわかるように、クラス属性にアクセスするには2つの方法があります:

  1. クラス自体を通じて: Dog.species
  2. クラスの任意のインスタンスを通じて: fluffy.species または buddy.species

どちらの方法も同じ結果を得ます。それは、「犬の種は何ですか?」や「Fluffyの種は何ですか?」と尋ねた場合、答えが同じであるように!

クラス属性の修正

クラス属性は修正することができますが、注意してください!クラス属性を修正すると、クラスのすべてのインスタンスに影響を与えます。例を見てみましょう:

class Cat:
species = "Felis catus"
count = 0

def __init__(self, name):
self.name = name
Cat.count += 1

whiskers = Cat("Whiskers")
mittens = Cat("Mittens")

print(Cat.count)  # 出力: 2
print(whiskers.count)  # 出力: 2
print(mittens.count)  # 出力: 2

Cat.species = "Felis silvestris catus"

print(Cat.species)  # 出力: Felis silvestris catus
print(whiskers.species)  # 出力: Felis silvestris catus
print(mittens.species)  # 出力: Felis silvestris catus

この例では、countというクラス属性を使用して、作成した猫の数を追跡しています。新しいCatオブジェクトを作成するたびに、Cat.countをインクリメントします。また、speciesをすべての猫に一度に変更することで、Cat.speciesを修正しました。

クラス属性の重要性

クラス属性は、いくつかのシナリオで非常に有用です:

  1. クラスのすべてのインスタンスで同じであるべき定数を保存するため。
  2. クラスのすべてのインスタンス間でデータを追跡するため(例えば、私たちのCat.countの例)。
  3. デフォルト値を定義し、必要に応じてインスタンスで上書きするため。

内蔵クラス属性

Pythonのクラスには、とても役立つ内蔵属性があります。いくつかを見てみましょう:

class MyClass:
x = 5

def my_method(self):
pass

print(MyClass.__name__)  # 出力: MyClass
print(MyClass.__doc__)  # 出力: None(docstringを提供していないため)
print(MyClass.__dict__)  # 出力: {'__module__': '__main__', 'x': 5, 'my_method': <function MyClass.my_method at ...>}
print(MyClass.__module__)  # 出力: __main__

内蔵クラス属性へのアクセス

以下は、一般的な内蔵クラス属性とそのアクセス方法の一覧です:

属性 説明 アクセス
name クラスの名前 MyClass.name
doc クラスのdocstring MyClass.doc
dict クラスの名前空間を含む辞書 MyClass.dict
module クラスが定義されているモジュールの名前 MyClass.module
bases 基本クラスを含むタプル MyClass.bases

インスタンス属性

クラス属性について理解したので、インスタンス属性についても簡単に触れて、違いを見比べましょう。インスタンス属性は、クラスから作成される各オブジェクトに固有のものです。

class Student:
school = "Python High"  # クラス属性

def __init__(self, name, grade):
self.name = name  # インスタンス属性
self.grade = grade  # インスタンス属性

alice = Student("Alice", 10)
bob = Student("Bob", 11)

print(Student.school)  # 出力: Python High
print(alice.school)    # 出力: Python High
print(bob.school)      # 出力: Python High

print(alice.name)      # 出力: Alice
print(bob.name)        # 出力: Bob

Student.school = "Python University"
print(alice.school)    # 出力: Python University
print(bob.school)      # 出力: Python University

alice.school = "Python Elementary"
print(alice.school)    # 出力: Python Elementary
print(Student.school)  # 出力: Python University
print(bob.school)      # 出力: Python University

インスタンス属性対クラス属性

インスタンス属性とクラス属性の主な違いは以下の通りです:

  1. クラス属性はすべてのインスタンスが共有しますが、インスタンス属性は各インスタンスに固有です。
  2. クラス属性はクラスの中に定義されていますが、いかなるメソッドの外にも置かれていますが、インスタンス属性は通常、__init__メソッドの中で定義されます。
  3. クラス属性を変更するとすべてのインスタンスに影響を与えます(インスタンスがそれを上書きしていない限り)、しかし、インスタンス属性を変更すると、その特定のインスタンスにのみ影響します。

覚えておきましょう、インスタンスに属性にアクセスしようとするとき、Pythonはまずインスタンス属性を探します。見つからなければ、次にクラス属性を探します。これが、クラス属性を特定のインスタンスで「上書き」するために、同じ名前のインスタンス属性を作成することができる理由です。

それでは、Pythonのクラス属性についての短いコースはここまでです。覚えるには実践が必要ですので、これらの概念を実験し、自分のクラスを作成し、属性をいじってみて、何が起こるかを確認してください。楽しいプログラミングを!

Credits: Image by storyset