<p>我不相信您提供了正确的代码,但是您已经提供了足够的代码来确定这里发生了什么</p>
<pre><code>a = list()
b = list
a.append(1)
b.append(1)
</code></pre>
<p>哪一个会引起错误?显然,附加到<code>b</code>。“list”类型的对象有一个“append”方法,而基类“type list”没有。在</p>
<p>在某个地方,您将类型<code>LargeManaPotion</code>分配给一个变量,并试图从中访问字段{<cd3>}。但是类型本身没有这些字段。之所以可以这样做,是因为在python中,类是第一类对象,可以像其他对象一样传递</p>
<hr/>
<p>让我们看看更接近您的实时代码</p>
^{pr2}$
<p>现在问题在哪里?它们都是<code>Pot</code>的实例,不是吗?为什么只有最后一个会引发AttributeError?在</p>
<p>当然,因为它们不尽相同。前4项是类Pot的<strong>实例。从方法<code>__new__</code>返回,该方法是在类<code>type Pot</code>中定义的,当我在变量名后面使用“括号表示法”时,该方法将被调用。在运行时,python不知道变量“Pot”是什么。它恰好是一个类型变量,它的调用生成一个实例对象。在</p>
<p>最后一项是<strong>类“type Pot”的实例。它不是一个锅。这是一种类型。它的<code>__class__</code>属性不是Pot。它的<code>__class__</code>属性是type</strong>类型用于生成实例。在类型中“添加”是没有意义的。在</p>
<hr/>
<p>假设你在现实生活中有药剂。你可以用药水做事。你可以喝。你可以检查他们的沸点(如果他们有标签,或者通过科学)。在</p>
<p>相反,假设你有一种药剂的配方。你说:“喝这个食谱”配方的沸点是多少。宇宙正在回应:“那是未定义的”。你是想看看药剂。相反,你看了它的配方。像所有的OO隐喻一样,这一个是不完整的。附加阅读:</p>
<ul>
<li><a href="https://stackoverflow.com/questions/674304/pythons-use-of-new-and-init">What happens when I use ^{<cd9>} notation on a class</a></li>
<li><a href="https://stackoverflow.com/questions/111234/what-is-a-callable-in-python">What happens if I use ^{<cd9>} notation on a nonclass</a></li>
<li><a href="https://stackoverflow.com/questions/207000/python-difference-between-class-and-instance-attributes">Class attributes?</a></li>
<li><a href="https://docs.python.org/2/tutorial/classes.html" rel="nofollow noreferrer">Wait what's a class</a></li>
<li><a href="https://docs.python.org/2/c-api/typeobj.html" rel="nofollow noreferrer">Wait what's a type</a></li>
<li><a href="https://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python">Wait what's a metaclass</a></li>
<li><a href="https://en.wikipedia.org/wiki/Metaphor" rel="nofollow noreferrer">Wait what's a metaphor</a></li>
<li><a href="https://meta.stackoverflow.com/">Wait what's meta</a></li>
</ul>