我正在阅读 python 描述符,那里有一行
Python 首先在实例字典中查找成员。如果没有找到,它会在类字典中查找。
我真的很困惑什么是实例字典,什么是类字典
谁能用代码解释一下那是什么
我认为他们是一样的
我正在阅读 python 描述符,那里有一行
Python 首先在实例字典中查找成员。如果没有找到,它会在类字典中查找。
我真的很困惑什么是实例字典,什么是类字典
谁能用代码解释一下那是什么
我认为他们是一样的
实例字典保存对分配给实例的所有对象和值的引用,类级别字典保存类命名空间中的所有引用。
举个例子:
>>> 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
实例字典 - 一个添加到类外部,一个添加到__init__
方法中的每个实例。而demo2
instance 只有 1 个实例字典,即在__init__
方法中添加的字典。
除此之外,这两个实例都有一个共同的字典——类字典。
这些 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__
f
并C.__dict__
成功C.f(c)
现在,让我们做一个技巧:
def f_french():
print "Bonjour!"
c.f = f_french
我们刚刚修改了对象自己的字典。这意味着,c.f()
现在将打印Bounjour!
. 这不会影响原始的类行为,因此其他C
的实例仍然会说英语。
类字典在类的所有实例(对象)之间共享,而每个实例(对象)都有自己单独的实例字典副本。
您可以在每个实例的基础上单独定义属性,而不是为整个类
例如。
class A(object):
an_attr = 0
a1 = A()
a2 = A()
a1.another_attr = 1
现在 a2 将没有 another_attr。那是实例字典而不是类字典的一部分。
Rohit Jain有最简单的 python 代码来快速解释这一点。但是,在 Java 中理解相同的想法会很有用,这里有更多关于类和实例变量的信息