3

これは、インスタンス変数に関する初心者の Python の質問です。

次の Python 2.7 クラス定義を検討してください。

class Foo(object):
    a = 1

    def __init__(self):
            self.b = 2

    def __repr__(self):
            return "%s" % self.__dict__

のインスタンスを作成すると、 が含まれますがFooFoo.__dict__は含まれbませんa

>>> x=Foo()
>>> x
{'b': 2}
>>> dir(x)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', 
 '__getattribute__', '__hash__', '__init__', '__module__', '__new__', 
 '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
 '__str__', '__subclasshook__', '__weakref__', 'a', 'b']
>>> x.__dict__
{'b': 2}

そして、ここで私はPythonの道をかなりよく理解していると思いました.

x.aとはどう違いx.bますか?私が知る限り、それらは両方ともインスタンス変数です。

編集:わかりました、 Pythonドキュメントを読み直して、インスタンス変数ではなくクラス属性Foo.aであることがわかりました。うーん...新しい値を割り当てることができ、新しい値はインスタンスにのみ影響するという事実から混乱が生じていると思います-私は今、属性の上にメンバー変数をエイリアスしていると思います:x.axFoo.a

>>> y=Foo()
>>> y.a = 2
>>> y
{'a': 2, 'b': 2}
>>> x
{'b': 2}
>>> x.a
1
>>> z=Foo()
>>> z
{'b': 2}
>>> z.a
1
>>> Foo.a
1
>>> x.a
1
>>> y.a
2

そこで、 の以前の値を上書きすると、エイリアスされていないFoo.aのすべてのインスタンスに影響します。FooFoo.a

>>> Foo.a=999
>>> x.a
999
>>> y.a
2
4

3 に答える 3

7

あなたaはインスタンス変数ではありません。クラスの一部として定義しました。

>>> class Foo(object):
...    a = 1
...
>>> Foo.a
1

インスタンス変数が必要な場合は__init__、オブジェクトの作成時にこのメソッドが呼び出されるため、メソッド内に配置する必要があります。

于 2012-05-12T19:33:28.253 に答える
4

aはインスタンス属性ではなく、クラス属性です。

于 2012-05-12T19:33:20.140 に答える
0

これはあなたをさらに助けることができますか?

>>> class X(object):

    def __getattribute__(self, name):
        print name
        return object.__getattribute__(self, name)


>>> l = dir(X())
__dict__
__members__
__methods__
__class__
>>> l
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
于 2012-05-12T19:54:01.977 に答える