5

私はpython記述子を読んでいて、そこに1行ありました

Python は、最初にインスタンス ディクショナリでメンバーを検索します。見つからない場合は、クラス ディクショナリで検索します。

インスタンス辞書とクラス辞書とは何か、私は本当に混乱しています

誰でもコードで説明してもらえますか

私はそれらを同じように考えていました

4

6 に答える 6

7

インスタンス dict は、インスタンスに割り当てられたすべてのオブジェクトと値への参照を保持し、クラス レベルの dict は、クラスの名前空間ですべての参照を保持します。

次の例を見てください。

>>> class A(object):
...    def foo(self, bar):
...       self.zoo = bar
...
>>> i = A()
>>> i.__dict__ # instance dict is empty
{}
>>> i.foo('hello') # assign a value to an instance
>>> i.__dict__ 
{'zoo': 'hello'} # this is the instance level dict
>>> i.z = {'another':'dict'}
>>> i.__dict__
{'z': {'another': 'dict'}, 'zoo': 'hello'} # all at instance level
>>> A.__dict__.keys() # at the CLASS level, only holds items in the class's namespace
['__dict__', '__module__', 'foo', '__weakref__', '__doc__']
于 2013-02-10T07:20:17.977 に答える
6

この例で理解できると思います。

class Demo(object):
    class_dict = {}   # Class dict, common for all instances

    def __init__(self, d):
        self.instance_dict = d   # Instance dict, different for each instance

そして、次のようにその場でインスタンス属性を追加することはいつでも可能です:-

demo = Demo({1: "demo"})
demo.new_dict = {}  # A new instance dictionary defined just for this instance

demo2 = Demo({2: "demo2"})   # This instance only has one instance dictionary defined in `init` method

したがって、上記の例では、demoインスタンスに2インスタンスディクショナリがあります。1つはクラスの外部に追加され、もう1つは__init__メソッドの各インスタンスに追加されます。一方、demo2インスタンスにはインスタンスディクショナリが1つだけあり、1つは__init__メソッドに追加されます。

それとは別に、両方のインスタンスには共通のディクショナリ(クラスディクショナリ)があります。

于 2013-02-10T07:10:52.827 に答える
2

これらの辞書は、オブジェクトまたはクラス全体の名前空間を表す内部的な方法です。

クラスがあるとします:

class C(object):
    def f(self):
        print "Hello!"

c = C()

この時点で、fはクラス dict で定義されたメソッド (f in C.__dict__であり、Python 2.7 に関してはC.fバインドされていないメソッドです)。

c.f()次の手順を実行します。

  • 探してf失敗c.__dict__する
  • を探してf成功C.__dict__する
  • 電話C.f(c)

では、トリックをやってみましょう:

def f_french():
    print "Bonjour!"

c.f = f_french

オブジェクト自身の dict を変更したところです。つまり、c.f()が出力されますBounjour!。これは元のクラスの動作には影響しないため、 otherCのインスタンスは引き続き英語を話します。

于 2013-02-10T07:19:33.073 に答える
1

クラスdictは、クラスのすべてのインスタンス(オブジェクト)間で共有されますが、各インスタンス(オブジェクト)には、インスタンスdictの独自の個別のコピーがあります。

于 2013-02-10T07:09:57.023 に答える
0

クラス全体ではなく、インスタンスごとに個別に属性を定義できます

たとえば。

class A(object):
    an_attr = 0

a1 = A()
a2 = A()

a1.another_attr = 1

これで、a2にはanother_attrがなくなります。これは、クラスdictではなくインスタンスdictの一部です。

于 2013-02-10T07:10:25.823 に答える
0

Rohit Jainには、これを簡単に説明するための最も単純な Python コードがあります。ただし、Java で同じ考え方を理解することは役に立ちます。クラス変数とインスタンス変数に関するより多くの情報がここにあります。

于 2013-02-10T07:14:21.943 に答える