2013-02-10 66 views
1

我讀了Python描述符,並有一條線有什麼是例如字典和類字典之間的dfifference

Python的首先查找在實例字典的成員。如果找不到 ,它會在類字典中查找它。

我真搞不清楚是什麼情況下字典,什麼是類字典

誰能請解釋我的代碼什麼是

我想他們作爲同一

回答

2

實例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__'] 
+0

感謝Burhan,那是我正在尋找的解釋。就像我們動態分配實例字典一樣。我們可以動態地分配類字典 – user196264097 2013-02-10 07:25:23

+0

@ user9否,你不能。 – 2013-02-10 07:30:22

1

類字典在類的所有實例(對象)之間共享,而每個實例(對象)都有它自己的實例字典副本。

0

您可以在每個實例的基礎上,而不是全班

對於如單獨定義的屬性。

class A(object): 
    an_attr = 0 

a1 = A() 
a2 = A() 

a1.another_attr = 1 

現在a2不會有another_attr。這是實例字典的一部分,而不是類字典。

4

我想,你可以用這個例子來理解。

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實例字典 - 一個外班加,並在__init__方法中添加到每個實例中的一個。而demo2實例只有1個實例字典,在__init__方法中增加了一個。

除此之外,兩個實例都有一個通用字典 - 類字典。

+0

好的答案羅希特 – 2013-02-10 07:14:19

+0

@GrijeshChauhan ..:d – 2013-02-10 07:15:56

+0

我不明白,我們怎麼能在類外添加屬性。 new_dict不是類 – user196264097 2013-02-10 07:19:48

0

Rohit Jain有最簡單的python代碼來解釋這個很快。然而,在Java中理解相同的想法可能是有用的,並且有關於類和實例變量的更多信息here

+0

請勿添加Java。不正確的地方 – 2013-02-10 07:15:10

0

這些字典是表示對象或類的命名空間的內部方式。

假設我們有一個類:

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

c = C() 

此時,f是在類字典中定義的方法(f in C.__dict__,並C.f是在Python 2.7方面的未結合的方法)。

c.f()將進行以下步驟:

  • fc.__dict__C.__dict__失敗
  • f和成功
  • 呼叫C.f(c)

現在,讓我們做一個絕招:

def f_french(): 
    print "Bonjour!" 

c.f = f_french 

我們剛剛修改了對象自己的字典。這意味着,c.f()現在將打印Bounjour!。這不會影響原始的課程行爲,所以其他C的實例仍會說英語。

+0

你能告訴我什麼是未綁定的方法和綁定方法 – user196264097 2013-02-10 07:29:05

+0

@ user9當然。你可能已經注意到你總是必須在每個方法中聲明那個討厭的'self'參數,但是在調用方法時不必傳遞它。當你得到'func = instance.method'時,下面會發生一些魔法,所以'func'綁定到實例並且不需要'self'(它可以被稱爲'func()')。這就是所謂的綁定方法。另一方面,'Class.method'也是可調用的,但是沒有綁定(不知道實例),所以你必須明確地調用它作爲'Class.method(instance)'。 – bereal 2013-02-10 08:02:11

+0

在你的代碼中Cf是一個未綁定的方法,你能否給我舉例說明你可以在類中聲明綁定的實例方法 – user196264097 2013-02-10 08:14:29