<p>我在这里看到了构造函数之间的一个误解——构造对象和初始化对象:</p>
<p><a href="https://stackoverflow.com/questions/674304/pythons-use-of-new-and-init">Python's use of ^{<cd1>} and ^{<cd2>}?</a></p>
<blockquote>
<p>Use <code>__new__</code> when you need to control the creation of a <em>new instance</em>. Use <code>__init__</code> when you need to control initialization of a new instance.</p>
</blockquote>
<p>所以我们在这里一定要小心。</p>
<blockquote>
<p>I read that the constructor is like the first argument passed to the class, which makes sense to me since the parameters seem to be passed to the class via the <code>__init__</code> method. </p>
</blockquote>
<p>构造函数不会传递给类,准确地说,构造函数(<code>__new__</code>)的结果将是类或其子类中每个实例方法的第一个参数(注意:<code>__new__</code>仅适用于新样式的类):</p>
<pre><code>class A:
def __new__(self):
return 'xyz'
</code></pre>
<p>查看调用类(创建对象)时发生的情况:</p>
<pre><code>>>> A()
'xyz'
>>> type(A())
<class 'str'>
</code></pre>
<p>调用类不再返回类型为<code>A</code>的实例,因为我们更改了构造函数<code>__new__</code>的机制。实际上,这样做不仅改变了类的全部含义,而且很难破译。在创建特定对象的过程中,不太可能切换对象的类型。我希望这句话有意义,如果没有,它将如何在您的代码意义!</p>
<pre><code>class A:
def __new__(self):
return 'xyz'
def type_check(self):
print(type(self))
</code></pre>
<p>看看当我们试图调用<code>type_check</code>方法时会发生什么:</p>
<pre><code>>>> a = A()
>>> a
'xyz'
>>> a.type_check()
AttributeError: 'str' object has no attribute 'type_check'
</code></pre>
<p><code>a</code>不是类<code>A</code>的对象,因此基本上您不再有权访问类<code>A</code>。</p>
<p><code>__init__</code>用于初始化对象的状态。与其调用在创建后初始化对象成员的方法,<code>__init__</code>通过在创建期间初始化对象的成员来解决这个问题,所以如果在类中有一个名为<code>name</code>的成员,并且希望在创建类时初始化<code>name</code>,而不是调用额外的方法<code>init_name('name')</code>,您肯定会为此目的使用<code>__init__</code>。</p>
<blockquote>
<p>So when I 'call' the class, I pass it the parameters from the <code>__init__</code> method?</p>
</blockquote>
<p>调用类时,传递参数<code>__init__</code>方法?</p>
<p>无论您传递类的参数是什么,所有参数都将传递给<code>__init__</code>,并自动为您添加一个额外的参数,这是Python通常称为<code>self</code>(实例本身)的隐含对象,它将始终作为最左的参数自动传递:</p>
<pre><code>class A:
def __init__(self, a, b):
self.a = a
self.b = b
</code></pre>
<hr/>
<pre><code> A( 34, 35)
self.a = 34 | |
| |
| | self.b = 35
init(self, a, b)
|
|
|
The instance that you created by calling the class A()
</code></pre>
<p><strong>注意:</strong><code>__init__</code>对两者都有效。然而,<code>__new__</code>只适用于新样式的类。</em></p>