5

我正在阅读 python 描述符,那里有一行

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

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

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

我认为他们是一样的

4

6 回答 6

7

实例字典保存对分配给实例的所有对象和值的引用,类级别字典保存类命名空间中的所有引用。

举个例子:

>>> 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实例字典 - 一个添加到类外部,一个添加到__init__方法中的每个实例。而demo2instance 只有 1 个实例字典,即在__init__方法中添加的字典。

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

于 2013-02-10T07:10:52.827 回答
2

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

假设我们有一个类:

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__
  • 寻找fC.__dict__成功
  • 称呼C.f(c)

现在,让我们做一个技巧:

def f_french():
    print "Bonjour!"

c.f = f_french

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

于 2013-02-10T07:19:33.073 回答
1

类字典在类的所有实例(对象)之间共享,而每个实例(对象)都有自己单独的实例字典副本。

于 2013-02-10T07:09:57.023 回答
0

您可以在每个实例的基础上单独定义属性,而不是为整个类

例如。

class A(object):
    an_attr = 0

a1 = A()
a2 = A()

a1.another_attr = 1

现在 a2 将没有 another_attr。那是实例字典而不是类字典的一部分。

于 2013-02-10T07:10:25.823 回答
0

Rohit Jain有最简单的 python 代码来快速解释这一点。但是,在 Java 中理解相同的想法会很有用,这里有更多关于类和实例变量的信息

于 2013-02-10T07:14:21.943 回答