Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python类成员查找的底层机制_Python_Dictionary_Lookup_Member - Fatal编程技术网

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 = [

在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 = [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
执行属性查找:它必须找到属性才能删除它。记住:它实际上是从某个名称空间中删除属性,因此需要执行查找。它不会传递属性查找结果的值,因为这样会丢失有关属性来源的信息。