<p>Python的OOP实现的全部复杂性远远超出了堆栈溢出答案的范围,但是可以提供一个概述。这会掩盖很多细节,比如元类、多重继承、描述符和C级API。不过,它应该让您了解为什么实现这样的事情是可能的,以及它是如何完成的一般印象。如果您想要完整的细节,您应该浏览<a href="https://github.com/python/cpython" rel="nofollow noreferrer">CPython source code</a>。你知道吗</p>
<hr/>
<p>像<code>Person</code>类的实例这样的对象由以下内容组成:</p>
<ul>
<li>一个班级</li>
<li>保留其属性的格言</li>
<li>其他现在不相关的东西,比如<code>__weakref__</code>。你知道吗</li>
</ul>
<p>一个类也很简单。是的</p>
<ul>
<li>基类</li>
<li>保留其属性的格言</li>
<li>其他现在不相关的东西,比如类名。你知道吗</li>
</ul>
<hr/>
<p>当您使用<code>class</code>语句定义一个类时,Python会绑定一个指向您选择的基类的指针(如果您没有选择基类,则为<code>object</code>)和一个包含您定义的方法的dict,这就是您的新class对象。有点像下面的元组</p>
<pre><code>Person = (object,
{'__init__': <that __init__ method you wrote>,
'getInfo': <that getInfo method you wrote>},
those irrelevant bits we're glossing over)
</code></pre>
<p>但不是元组。(在C级,这个记录几乎是,但不完全是,作为一个结构实现的。)</p>
<hr/>
<p>在创建类的实例时,Python将指向类的指针和实例属性的新dict捆绑在一起,这就是您的实例。有点像下面的元组:</p>
<pre><code>personOne = (Person, {}, those irrelevant bits we're glossing over)
</code></pre>
<p>不过,不是元组。同样,它几乎(但不完全)实现为C级的结构。你知道吗</p>
<p>然后它运行<code>__init__</code>,传递<code>__init__</code>新实例和您提供给类的任何其他参数:</p>
<pre><code>Person.__init__(personOne, "Bob", 34)
</code></pre>
<p>属性赋值转换为对象dict中的设置项,因此<code>__init__</code>中的赋值:</p>
<pre><code>def __init__(self, name, age):
self.name = name
self.age = age
</code></pre>
<p>使dict最终处于以下状态:</p>
<pre><code>{'name': 'Bob', 'age': 34}
</code></pre>
<hr/>
<p>调用<code>personOne.getInfo()</code>时,Python会查找<code>personOne</code>的dict、类的dict、超类的dict等,直到找到<code>'getInfo'</code>键的条目。关联的值将是<code>getInfo</code>方法。如果在类dict中找到该方法,Python将插入<code>personOne</code>作为第一个参数。(它知道如何插入该参数的详细信息在<a href="https://docs.python.org/2/howto/descriptor.html" rel="nofollow noreferrer">descriptor protocol</a>中)</p>