Python 实例dict和类dict之间的差异是什么
我正在阅读python描述符,其中有一行 Python首先在实例字典中查找成员。如果是 未找到,它会在类词典中查找它 我真的很困惑什么是实例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 现
我认为它们是相同的,因为类的所有实例(对象)都共享类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如果我理解你的问题是正确的,你不能在类中声明绑定方法,这实际上是一个矛盾修饰法。