1. ホーム
  2. python

[解決済み] クラス属性とインスタンス属性の違いは何ですか?

2022-05-11 11:49:06

質問

何か意味のある区別があるのでしょうか。

class A(object):
    foo = 5   # some default value

vs.

class B(object):
    def __init__(self, foo=5):
        self.foo = foo

インスタンスを大量に作成する場合、2つのスタイルでパフォーマンスや必要なスペースに違いはありますか?コードを読んだとき、2つのスタイルの意味が大きく異なると思いますか?

どのように解決するのですか?

重要な セマンティック の違いがあります (パフォーマンスの考慮を超えて)。

  • 属性がインスタンスに定義されている場合 (これは通常行うことです)、参照されるオブジェクトが複数存在する可能性があります。 それぞれがその属性の全く別のバージョンを取得します .
  • 属性がクラスで定義されている場合 の場合、参照される基礎となるオブジェクトは1つだけなので、そのクラスの異なるインスタンスに対する操作が両方とも属性を設定/(追加/拡張/挿入/など)しようとすると
    • もしその属性が 組み込み型 (int、float、boolean、string など) である場合、あるオブジェクトに対する操作は、その値
    • もし属性が ミュータブル型 (リストやディクショナリなど)である場合、不要な漏えいが発生します。

例えば

>>> class A: foo = []
>>> a, b = A(), A()
>>> a.foo.append(5)
>>> b.foo
[5]
>>> class A:
...  def __init__(self): self.foo = []
>>> a, b = A(), A()
>>> a.foo.append(5)
>>> b.foo    
[]