我讀了Python描述符,並有一條線有什麼是例如字典和類字典之間的dfifference
Python的首先查找在實例字典的成員。如果找不到 ,它會在類字典中查找它。
我真搞不清楚是什麼情況下字典,什麼是類字典
誰能請解釋我的代碼什麼是
我想他們作爲同一
我讀了Python描述符,並有一條線有什麼是例如字典和類字典之間的dfifference
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 A(object):
an_attr = 0
a1 = A()
a2 = A()
a1.another_attr = 1
現在a2不會有another_attr。這是實例字典的一部分,而不是類字典。
我想,你可以用這個例子來理解。
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__
方法中增加了一個。
除此之外,兩個實例都有一個通用字典 - 類字典。
好的答案羅希特 – 2013-02-10 07:14:19
@GrijeshChauhan ..:d – 2013-02-10 07:15:56
我不明白,我們怎麼能在類外添加屬性。 new_dict不是類 – user196264097 2013-02-10 07:19:48
Rohit Jain有最簡單的python代碼來解釋這個很快。然而,在Java中理解相同的想法可能是有用的,並且有關於類和實例變量的更多信息here
請勿添加Java。不正確的地方 – 2013-02-10 07:15:10
這些字典是表示對象或類的命名空間的內部方式。
假設我們有一個類:
class C(object):
def f(self):
print "Hello!"
c = C()
此時,f
是在類字典中定義的方法(f in C.__dict__
,並C.f
是在Python 2.7方面的未結合的方法)。
c.f()
將進行以下步驟:
f
在c.__dict__
和C.__dict__
失敗f
和成功C.f(c)
現在,讓我們做一個絕招:
def f_french():
print "Bonjour!"
c.f = f_french
我們剛剛修改了對象自己的字典。這意味着,c.f()
現在將打印Bounjour!
。這不會影響原始的課程行爲,所以其他C
的實例仍會說英語。
你能告訴我什麼是未綁定的方法和綁定方法 – user196264097 2013-02-10 07:29:05
@ user9當然。你可能已經注意到你總是必須在每個方法中聲明那個討厭的'self'參數,但是在調用方法時不必傳遞它。當你得到'func = instance.method'時,下面會發生一些魔法,所以'func'綁定到實例並且不需要'self'(它可以被稱爲'func()')。這就是所謂的綁定方法。另一方面,'Class.method'也是可調用的,但是沒有綁定(不知道實例),所以你必須明確地調用它作爲'Class.method(instance)'。 – bereal 2013-02-10 08:02:11
在你的代碼中Cf是一個未綁定的方法,你能否給我舉例說明你可以在類中聲明綁定的實例方法 – user196264097 2013-02-10 08:14:29
感謝Burhan,那是我正在尋找的解釋。就像我們動態分配實例字典一樣。我們可以動態地分配類字典 – user196264097 2013-02-10 07:25:23
@ user9否,你不能。 – 2013-02-10 07:30:22