我正在阅读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
实例现在有两个实例字典——一个在类外添加,另一个在__init__
方法中添加到每个实例中。而demo2
实例只有一个实例字典,即在__init__
方法中添加的那个。__init__
方法之外随时添加实例数据成员。 - Rohit Jain这些字典是表示对象或类范围命名空间的内部方式。
假设我们有一个类:
class C(object):
def f(self):
print "Hello!"
c = C()
此时,f
是在类dict中定义的方法 (f in C.__dict__
),而 C.f
是 Python 2.7 中的一个未绑定方法。
c.f()
将执行以下步骤:
c.__dict__
中的 f
失败C.__dict__
中的 f
成功C.f(c)
现在,让我们来一个技巧:
def f_french():
print "Bonjour!"
c.f = f_french
Bounjour!
。这不会影响原始类行为,所以其他C的实例仍然会说英语。self
参数,但在调用方法时不必传递它。当你使用 func = instance.method
时,一些神奇的事情发生了,因此 func
绑定到实例上,不需要 self
(可以直接调用 func()
)。这就是所谓的绑定方法。另一方面,Class.method
也是可调用的,但未绑定(不知道实例),因此你必须显式地调用它,如 Class.method(instance)
。 - bereal类字典在该类的所有实例(对象)之间共享,而每个实例(对象)都有自己单独的实例字典副本。
你可以针对每个实例单独定义属性,而不是整个类。
例如:
class A(object):
an_attr = 0
a1 = A()
a2 = A()
a1.another_attr = 1