Python类成员查找的底层机制
在Python中,如果我定义三个类:Python类成员查找的底层机制,python,dictionary,lookup,member,Python,Dictionary,Lookup,Member,在Python中,如果我定义三个类: class A: name = 'oliver' hailstone_ending = [4,2,1] class B: def __init__(self): self.name = 'oliver' self.hailstone_ending = [4,2,1] class C: pass c = C() c.name = 'oliver' c.hailstone_ending = [
class A:
name = 'oliver'
hailstone_ending = [4,2,1]
class B:
def __init__(self):
self.name = 'oliver'
self.hailstone_ending = [4,2,1]
class C:
pass
c = C()
c.name = 'oliver'
c.hailstone_ending = [4,2,1]
在引擎盖下,每个类的成员查找功能是否相同?似乎A
只需要在字典上查找所有实例的成员<另一方面,code>C需要使用存储在每个实例中的字典。如果解释器非常聪明,理论上它可以注意到B
的所有实例都必须包括成员name
和hailstone\u end
;因此,它可能相当于A
但另一方面,如果允许在查找类成员的字典上执行del
操作,则所有这些类中的查找机制可能是等效的,因为可用的成员将依赖于实例
我感兴趣的是,我有一些代码创建了数千个C
类型的类,我注意到它非常慢,而且内存不足。我最近以不同的方式重写了它,感觉效率更高(但我没有严格测试它,所以可能是相同的)
非常感谢您的洞察力 在python中,每个类和每个实例都有一个字典
A
使用类词典。类B
和C
的示例使用实例字典B
不会等同于A
——python并不打算快速,要证明B
的实例不会发生变异,即使不是不可能,也是非常困难的
证明:
>>> class D:
... def __init__(self):
... self.a = 3
...
>>> d = D()
>>> d.a
3
>>> D.a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: class D has no attribute 'a'
>>> dd = D()
>>> dd.a
3
>>> D.a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: class D has no attribute 'a'
>>D类:
... 定义初始化(自):
... self.a=3
...
>>>d=d()
>>>博士
3.
>>>博士
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:类D没有属性“a”
>>>dd=D()
>>>副学士
3.
>>>博士
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:类D没有属性“a”
你的问题让我想到了javascript的原型
另外:如果在实例字典中找不到成员,则成员查找可以依赖于类字典,但编写将使用实例字典
在引擎盖下,每个类的成员查找功能是否相同
除非覆盖\uuuu getattribute\uuuu
,否则属性查找首先检查对象属性,然后键入属性。它不在乎这门课是怎么来的
似乎只需要在字典上查找所有实例的成员;C、 另一方面,需要使用存储在每个实例中的字典。如果口译员非常聪明,理论上可以注意到B的所有实例都必须包括成员姓名和冰雹_结尾;因此,它可以相当于A
在
A
中,属性存储在A.\uu dict\uuu
中,即在类型上。在B
和C
中,属性存储在self.\uuuu dict\uuuu
中,即实例上。这两本词典在所有情况下都存在。没什么了。不,在B
和C
之间没有差异<代码>A与B
非常不同。解释器很聪明,注意到了这一点。我知道Python并不是为了快速而设计的——我经常听说这一点。我只是想知道这些事情。我学会了在TI-85图形计算器上编程,有时学习如何从小而隐蔽的地方挤出速度是很有趣的。如果你被一些看起来不太可能更快的事情所困扰,它会非常有用!一个调整:del
执行属性查找:它必须找到属性才能删除它。记住:它实际上是从某个名称空间中删除属性,因此需要执行查找。它不会传递属性查找结果的值,因为这样会丢失有关属性来源的信息。