Python - クラス属性
こんにちは、夢を持つプログラマーたち!今日は、Pythonのクラス属性の興味深い世界に飛び込んでいきましょう。プログラミングが初めての方でも心配しないでください;私はこの旅をステップバイステップに导いていくので、私の教える年月の中で数えきれないほどの生徒たちにすでに导いてきたようにです。それでは、始めましょう!
クラス属性(変数)
クラス属性とは、クラスの特定のインスタンスではなく、クラス全体に属する変数です。それは、そのクラスのすべてのオブジェクトが共有する特性と考えてください。
簡単な例から始めましょう:
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つの方法があります:
- クラス自体を通じて:
Dog.species
- クラスの任意のインスタンスを通じて:
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
を修正しました。
クラス属性の重要性
クラス属性は、いくつかのシナリオで非常に有用です:
- クラスのすべてのインスタンスで同じであるべき定数を保存するため。
- クラスのすべてのインスタンス間でデータを追跡するため(例えば、私たちの
Cat.count
の例)。 - デフォルト値を定義し、必要に応じてインスタンスで上書きするため。
内蔵クラス属性
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
インスタンス属性対クラス属性
インスタンス属性とクラス属性の主な違いは以下の通りです:
- クラス属性はすべてのインスタンスが共有しますが、インスタンス属性は各インスタンスに固有です。
- クラス属性はクラスの中に定義されていますが、いかなるメソッドの外にも置かれていますが、インスタンス属性は通常、
__init__
メソッドの中で定義されます。 - クラス属性を変更するとすべてのインスタンスに影響を与えます(インスタンスがそれを上書きしていない限り)、しかし、インスタンス属性を変更すると、その特定のインスタンスにのみ影響します。
覚えておきましょう、インスタンスに属性にアクセスしようとするとき、Pythonはまずインスタンス属性を探します。見つからなければ、次にクラス属性を探します。これが、クラス属性を特定のインスタンスで「上書き」するために、同じ名前のインスタンス属性を作成することができる理由です。
それでは、Pythonのクラス属性についての短いコースはここまでです。覚えるには実践が必要ですので、これらの概念を実験し、自分のクラスを作成し、属性をいじってみて、何が起こるかを確認してください。楽しいプログラミングを!
Credits: Image by storyset