2012-02-16 3 views

答えて

4

唯一の違いは、Foo.barは、Foo.bar = 1ステートメントが実行されるまで存在しないが、最初のケースではクラスオブジェクトの作成時に既に利用可能であるということです。

2番目のケースで利用できるようになる前にFoo.barが必要なコードがない限り、コードには何の効果もありません。しかし、クラスの属性を知るためにスクロールダウンする必要がないため、最初のオプションは読みやすさの点で優れていると言えます。

+0

ありがとうございました。 – mcepl

4

独自のコードを書いている場合は、一緒に行く:このバージョンBecase

class Foo(object): 
    bar = 1 

は:

class Foo(object): 
    pass 

Foo.bar = 1 

それは合法だにもかかわらず

  1. は、より多くのハックのように見えます。
  2. ほとんどの場合、読みにくいです。
  3. あなたはそのが作成されて前にbar属性にアクセスしようとすると、問題がある可能性があります:私は多くの違いが表示されないこと以外は

    >>> class Foo: 
    ...  pass 
    ... 
    >>> f = Foo() 
    >>> f.bar 
    Traceback (most recent call last): 
        File "<stdin>", line 1, in <module> 
    AttributeError: 'Foo' object has no attribute 'bar' 
    >>> Foo.bar = 1 
    >>> f.bar # but hey, now you're ok! 
    1 
    

を。

-1

両方のバージョンが同じです(この回答の最後にあるテストのトランスクリプトを参照してください)。どちらの場合も、barはすべてFooの同じインスタンスです。インスタンス上barを読み取るインスタンスが作成される時点で

は、Fooの値を読み取り、及びinstance.barが割り当てられるまでFoo.barに割り当て、インスタンスに反映されます。割り当ての瞬間に、インスタンスはそれ自身の__dict__エントリを取得します。これは、クラスとは完全に独立しています。

In [62]: class Foo: pass 

In [63]: Foo.bar = 1 

In [64]: Foo.bar 
Out[64]: 1 

In [65]: f = Foo() 

In [66]: f.bar 
Out[66]: 1 

In [67]: f.bar +=1 

In [68]: f.bar 
Out[68]: 2 

In [69]: Foo.bar 
Out[69]: 1 

In [70]: Foo.bar +=3 

In [71]: Foo.bar 
Out[71]: 4 

In [72]: g = Foo() 

In [73]: g.bar 
Out[73]: 4 

In [74]: class Qux: bar = 1 

In [75]: Qux.bar 
Out[75]: 1 

In [76]: q = Qux() 

In [77]: q.bar 
Out[77]: 1 

In [78]: q.bar+=1 

In [79]: q.bar 
Out[79]: 2 

In [80]: Qux.bar 
Out[80]: 1 

In [81]: Qux.bar +=1 

In [82]: r = Qux() 

In [83]: r.bar 
Out[83]: 2 

In [84]: q.bar 
Out[84]: 2 

In [85]: s = Qux() 

In [87]: s.__dict__ 
Out[87]: {} 

In [88]: q.__dict__ 
Out[88]: {'bar': 2} 

In [89]: Qux.bar = 'foo' 

In [90]: Qux.bar 
Out[90]: 'foo' 

In [91]: s.bar 
Out[91]: 'foo' 
+1

-1は間違っています: "Foo"のインスタンスは "bar"のコピーではなく、クラス属性にアクセスします。 aninstance属性が設定されると、それ自身の属性を取得します。私の答えはhttp://stackoverflow.com/questions/9302789/changing-variables-in-multiple-python-instances/9304924#9304924 – jsbueno

+0

@jsbueno:証明してください。この動作は、各インスタンスがクラスオブジェクト内の値のコピー(オブジェクトへのポインタ)を取得するのとまったく同じように見えます。 – Marcin

+0

@jsbueno:私が自分の証拠を追加しました。あなたがリンクしている答えには、実際にあなたの立場の証拠はありません。 – Marcin

関連する問題