以下の間に意味のある違いはありますか?
class A(object):
foo = 5 # some default value
対
class B(object):
def __init__(self, foo=5):
self.foo = foo
多数のインスタンスを作成する場合、2 つのスタイルのパフォーマンスやスペース要件に違いはありますか? コードを読むとき、2 つのスタイルの意味は大きく異なると思いますか?
ベストアンサー1
重要なセマンティック違い(パフォーマンスの考慮以外):
- 属性がインスタンス上で定義されている場合(これは通常行うことです)、複数のオブジェクトが参照される可能性があります。それぞれがその属性の全く別のバージョンを取得します。
- 属性がクラス上で定義されている場合参照される基になるオブジェクトは 1 つだけなので、そのクラスの異なるインスタンスに対する操作の両方が属性の設定/(追加/拡張/挿入など)を試行すると、次のようになります。
- 属性が組み込み型(int、float、boolean、stringなど)1つのオブジェクトに対する操作は値を上書き(破壊)します。
- 属性が可変型(リストや辞書など) の場合、不要な漏洩が発生します。
例えば:
>>> 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
[]