__init__() 内外の変数の違い(クラス属性とインスタンス属性)

PYTHON3 チュートリアル

Pythonのクラスにおける属性の違いを理解することは、オブジェクト指向プログラミングをマスターするための重要なステップです。この記事では、クラス属性とインスタンス属性の違いについて詳しく解説し、__init__()メソッド内外での変数の扱い方に焦点を当てます。

クラス属性とインスタンス属性の基礎

まず、クラス属性とインスタンス属性の基本的な違いを理解しましょう。クラス属性はクラス自身に属する属性であり、すべてのインスタンスで共有されます。一方、インスタンス属性は各インスタンス固有のものであり、インスタンスごとに異なる値を持つことができます。

クラス属性の例

class Dog:
    species = "Canis familiaris"  # クラス属性

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

# クラス属性にアクセス
print(Dog.species)  # 出力: Canis familiaris

# インスタンス作成
dog1 = Dog("Buddy", 5)
dog2 = Dog("Molly", 3)

# インスタンス属性にアクセス
print(dog1.name)  # 出力: Buddy
print(dog2.name)  # 出力: Molly

インスタンス属性の例

インスタンス属性は__init__()メソッド内で初期化され、各インスタンスに固有のデータを持たせることができます。

class Car:
    def __init__(self, make, model):
        self.make = make  # インスタンス属性
        self.model = model  # インスタンス属性

car1 = Car("Toyota", "Corolla")
car2 = Car("Honda", "Civic")

print(car1.make)  # 出力: Toyota
print(car2.model)  # 出力: Civic

クラス属性とインスタンス属性の違い

クラス属性を変更すると、すべてのインスタンスに影響しますが、インスタンス属性を変更すると、その特定のインスタンスにのみ影響します。以下の例で確認してみましょう。

class Bird:
    wings = 2  # クラス属性

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

# インスタンス作成
bird1 = Bird("Sparrow")
bird2 = Bird("Eagle")

# クラス属性を変更
Bird.wings = 3

print(bird1.wings)  # 出力: 3
print(bird2.wings)  # 出力: 3

# インスタンス属性を変更
bird1.name = "Robin"

print(bird1.name)  # 出力: Robin
print(bird2.name)  # 出力: Eagle

まとめ

クラス属性とインスタンス属性の違いを理解することは、Pythonで効果的なクラス設計を行うために重要です。クラス属性はすべてのインスタンスで共有されるため、共通のデータを保持するのに適しています。一方、インスタンス属性は個々のインスタンスの特定のデータを表現するのに使用されます。これらの属性の使い方をマスターし、オブジェクト指向プログラミングの理解を深めましょう。

__init__() 内外の変数の違いは、Pythonのクラス内で定義される属性に関する概念です。クラス内で定義される属性には、クラス属性とインスタンス属性の2種類があります。

クラス属性は、クラス定義の中で定義され、すべてのインスタンスで共有される属性です。これは、クラスの全てのインスタンスが同じ値を持つことを意味します。

一方、インスタンス属性は、各インスタンスごとに異なる値を持つ属性です。インスタンスが生成される際に、__init__()メソッド内で初期化されることが一般的です。

例えば、以下のようなクラスがあるとします。

“`python
class MyClass:
class_attr = 0

def __init__(self, instance_attr):
self.instance_attr = instance_attr

# クラス属性へのアクセス
print(MyClass.class_attr) # 0

# インスタンス属性へのアクセス
obj1 = MyClass(1)
obj2 = MyClass(2)
print(obj1.instance_attr) # 1
print(obj2.instance_attr) # 2
“`

この例では、class_attrはクラス属性であり、すべてのインスタンスで共有される一方、instance_attrはインスタンス属性であり、各インスタンスごとに異なる値を持ちます。

購読
通知
0 Comments
Inline Feedbacks
View all comments