0Pricing
Python Academy · レッスン

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

オブジェクトごとのデータと、クラスレベルで共有されるデータを区別します。

「インスタンス属性とクラス属性」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

導入

インスタンス属性とクラス属性の違いを理解すると、微妙なバグを防ぎ、共有状態を効率的に利用できます。

クラス属性

class Dog: legs = 4 — legs はすべてのインスタンスで共有されます。Dog.legs または dog.legs としてアクセスします。
class Dog:
    legs = 4
print(Dog.legs)
print(Dog().legs)

インスタンス属性

self.name = name in __init__ はインスタンスごとの属性です。各Dogはそれぞれ独自のnameを持ちます。
class Dog:
    def __init__(self, name):
        self.name = name
d1 = Dog('Rex')
d2 = Dog('Buddy')
print(d1.name, d2.name)

属性の検索順序

Pythonはまずインスタンスの __dict__、次にクラスの __dict__、その後に基底クラスを確認します。インスタンス属性はクラス属性を隠します。
class C:
    x = 10
c = C()
c.x = 99  # instance shadows class attr
print(c.x)  # 99
print(C.x)  # 10

可変なクラス属性の落とし穴

class C: items = [] — すべてのインスタンスが同じリストを共有します。1つのインスタンスで追加すると、すべてのインスタンスに影響します!
class C:
    items = []
C.items.append(1)
print(C().items)  # [1] — shared!

可変属性の落とし穴を解決する

初期化処理を __init__ に移します: def __init__(self): self.items = [] 各インスタンスが独自のリストを持ちます。
class C:
    def __init__(self):
        self.items = []
c1 = C(); c2 = C()
c1.items.append(1)
print(c1.items, c2.items)

__dict__の確認

obj.__dict__ はインスタンス属性の辞書です。Class.__dict__ はクラス属性の辞書です。
class Dog:
    legs = 4
    def __init__(self, name): self.name = name
d = Dog('Rex')
print(d.__dict__)
print(Dog.__dict__.keys())

ファクトリとしてのクラスメソッド

@classmethod は self の代わりに cls(クラス)を受け取ります。代替コンストラクターとして使います。
class Date:
    def __init__(self, y, m, d): self.y,self.m,self.d=y,m,d
    @classmethod
    def from_string(cls, s):
        y,m,d=map(int,s.split('-'))
        return cls(y,m,d)
dt=Date.from_string('2024-01-15')
print(dt.y,dt.m,dt.d)

静的メソッド

@staticmethod には self も cls もありません。インスタンスやクラスを必要としないものの、クラスに論理的に関連するユーティリティ関数に使います。
class MathUtils:
    @staticmethod
    def add(a, b): return a + b
print(MathUtils.add(3, 4))

クラス属性によるインスタンス数の追跡

クラス属性をカウンターとして使うと、作成されたインスタンスの数を追跡できます。
class Widget:
    count = 0
    def __init__(self):
        Widget.count += 1
Widget(); Widget(); Widget()
print(Widget.count)

hasattr()とvars()

hasattr(obj, 'name') は属性の存在を確認します。vars(obj) は obj.__dict__ と同等です。
class P:
    def __init__(self, x): self.x = x
p = P(5)
print(hasattr(p, 'x'), hasattr(p, 'z'))
print(vars(p))

確認問題

インスタンスから可変なクラス属性のリストに対して追加を行うと、どうなりますか?

復習

クラス属性は共有され、インスタンス属性はオブジェクトごとに存在します。インスタンス属性の検索結果がクラス属性より優先されます。可変オブジェクトは __init__ で初期化します。ファクトリメソッドには @classmethod を使います。

続けましょう

すばらしいです!次のレッスンに進んで、スキルをさらに伸ばしましょう。

よくある質問

「インスタンス属性とクラス属性」レッスンは無料ですか?

はい。「インスタンス属性とクラス属性」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「インスタンス属性とクラス属性」で何を学びますか?

オブジェクトごとのデータと、クラスレベルで共有されるデータを区別します。 ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「インスタンス属性とクラス属性」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. クラスと __init__ メソッド
  2. インスタンス属性とクラス属性
  3. インスタンスメソッドと self
  4. 特殊メソッド: __str__ と __repr__
← Python Academyに戻る