Python 实例dict和类dict之间的差异是什么

Python 实例dict和类dict之间的差异是什么,python,Python,我正在阅读python描述符,其中有一行 Python首先在实例字典中查找成员。如果是 未找到,它会在类词典中查找它 我真的很困惑什么是实例dict,什么是类字典 谁能用密码解释一下那是什么 我认为它们是相同的,因为类的所有实例(对象)都共享类dict,而每个实例(对象)都有自己的实例dict副本。您可以根据每个实例而不是整个类分别定义属性 例如 class A(object): an_attr = 0 a1 = A() a2 = A() a1.another_attr = 1 现

我正在阅读python描述符,其中有一行

Python首先在实例字典中查找成员。如果是 未找到,它会在类词典中查找它

我真的很困惑什么是实例dict,什么是类字典

谁能用密码解释一下那是什么


我认为它们是相同的,因为类的所有实例(对象)都共享类dict,而每个实例(对象)都有自己的实例dict副本。

您可以根据每个实例而不是整个类分别定义属性

例如

class A(object):
    an_attr = 0

a1 = A()
a2 = A()

a1.another_attr = 1

现在a2将不会有另一个属性。这是实例dict的一部分,而不是类dict。

我认为,您可以通过这个示例理解

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
实例字典-一个添加到类外,另一个添加到
\uuuuu init\uuu
方法中的每个实例。然而,
demo2
实例只有一个实例字典,这个字典是在
\uuuuu init\uuuu
方法中添加的


除此之外,这两个实例都有一个共同的字典——类字典。

有最简单的python代码来快速解释这一点。但是,理解Java中的相同思想可能会很有用,而且还有更多关于类和实例变量的信息

这些dict是表示对象或类范围名称空间的内部方式

假设我们有一个类:

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

c = C()
此时,
f
是类dict中定义的一个方法(
f在C中,而
C.f
在Python 2.7中是一个未绑定的方法)

c.f()
将执行以下步骤:

  • c.中查找
    f
    。\uuu dict\uuu
    并失败
  • C.\uu dict\uuu
    中查找
    f
    ,然后成功
  • 呼叫
    C.f(C)
现在,让我们做一个小把戏:

def f_french():
    print "Bonjour!"

c.f = f_french

我们刚刚修改了对象自己的dict。这意味着,
c.f()
现在将打印
Bounjour。这不会影响原始类的行为,因此其他
C
的实例仍会说英语。

实例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__']

我不明白,我们怎样才能在类外添加属性。new_dict不是中的数据成员class@user9这就是它在Python中的工作方式。您可以在类的
\uuuu init\uuuu
方法之外动态添加实例数据成员。谢谢Burhan,这就是我想要的解释。就像我们动态分配实例dict一样。我们可以动态分配类dictionaryi.z=some_val。。。我想了解更多关于这个表达。我的意思是,我虽然只限于在init函数中创建的属性,但似乎不是。这到底是什么?你能告诉我什么是unbound方法,什么是bound方法吗method@user9当然您可能已经注意到,您总是必须在每个方法中声明恼人的
self
参数,但在调用方法时不必传递它。当您获得
func=instance.method
时,下面会发生一些神奇的事情,因此
func
绑定到实例,而不需要
self
(它可以像
func()
一样调用)。这叫做绑定方法。另一方面,
Class.method
也是可调用但未绑定的(不知道实例),因此您必须显式地将其称为
Class.method(instance)
。在代码中,C.f是一个未绑定的方法,你能给我一个例子,你可以在里面声明绑定实例方法吗class@user196264097如果我理解你的问题是正确的,你不能在类中声明绑定方法,这实际上是一个矛盾修饰法。