私はpython記述子を読んでいて、そこに1行ありました
Python は、最初にインスタンス ディクショナリでメンバーを検索します。見つからない場合は、クラス ディクショナリで検索します。
インスタンス辞書とクラス辞書とは何か、私は本当に混乱しています
誰でもコードで説明してもらえますか
私はそれらを同じように考えていました
私はpython記述子を読んでいて、そこに1行ありました
Python は、最初にインスタンス ディクショナリでメンバーを検索します。見つからない場合は、クラス ディクショナリで検索します。
インスタンス辞書とクラス辞書とは何か、私は本当に混乱しています
誰でもコードで説明してもらえますか
私はそれらを同じように考えていました
インスタンス 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__']
この例で理解できると思います。
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__
メソッドに追加されます。
それとは別に、両方のインスタンスには共通のディクショナリ(クラスディクショナリ)があります。
これらの辞書は、オブジェクトまたはクラス全体の名前空間を表す内部的な方法です。
クラスがあるとします:
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
のインスタンスは引き続き英語を話します。
クラスdictは、クラスのすべてのインスタンス(オブジェクト)間で共有されますが、各インスタンス(オブジェクト)には、インスタンスdictの独自の個別のコピーがあります。
クラス全体ではなく、インスタンスごとに個別に属性を定義できます
たとえば。
class A(object):
an_attr = 0
a1 = A()
a2 = A()
a1.another_attr = 1
これで、a2にはanother_attrがなくなります。これは、クラスdictではなくインスタンスdictの一部です。
Rohit Jainには、これを簡単に説明するための最も単純な Python コードがあります。ただし、Java で同じ考え方を理解することは役に立ちます。クラス変数とインスタンス変数に関するより多くの情報がここにあります。