<p>您忘记了<code>self.getaccounts()</code>方法的最后一行中的<code>__init__</code>,因此contas保持为空,因为它永远不会被填充。你知道吗</p>
<hr/>
<p><strong>TL;DR确保保留对新创建实例的引用以使其保持活动状态
并对<em>此</em>实例执行以下方法调用。</strong></p>
<p><code>__init__</code>是在创建实例get之后调用的方法
初始化实例。每次都要创建一个类的实例
调用类就像调用<code>Account()</code>。你知道吗</p>
<p>但是如果您不保留对这个新创建的实例的(外部)引用,
不能对实例寻址以调用其上的其他方法。代码中发生了什么:</p>
<pre><code>Account().getaccounts() # new instance of Account created,
# i.a. __init__ called, finally getaccounts called
Account().accountsprinting() # new instance of Account created,
# i.a. __init__ called, finally accountsprinting called
</code></pre>
<p>这两个实例都很快被垃圾收集(假定是Python的CPython实现),因为您不持有对它们的外部引用,就像您将一个新实例分配给如下名称时所做的那样:<code>acc = Account()</code>。你知道吗</p>
<p>您可以通过比较identity和<code>Account(1) is Account(1) # False</code>或查看<code>id</code>号码来检查每次调用<code>Account()</code>时是否获得新对象:</p>
<pre><code>id(Account(1))
# 88311904
id(Account(1))
# 88312408
</code></pre>
<p>作为旁注:</p>
<p>它不必像上面的<code>acc</code>那样是一个命名引用,您还可以持有
隐式的、未命名的引用,例如,通过将新实例放置在列表中,列表将保留对实例的引用,从而使它们保持活动状态:</p>
<pre><code>class Account:
def __init__(self, x):
self.x = x
lst = [Account(1), Account(2)]
lst[0].x
# 1
lst[1].x
# 2
</code></pre>
<hr/>
<p><code>self</code>在代码中是连接(绑定)类和实例的(内部)引用。
如果像在实例方法<code>getaccounts</code>中对<code>self.contas[login] = senha</code>所做的那样分配给<code>self</code>,那么只对调用<code>getaccounts</code>的<em>实际</em>实例执行此操作。所以当你打电话给<code>Account().getaccounts()</code>和
稍后<code>Account().accountsprinting()</code>你这样做是为了两个不同的目的
实例,而不是在同一个实例上。因此,第二个实例有一个空的<code>contas</code>dict,因为对于<em>这个</em>实例,您之前没有调用<code>getaccounts()</code>。你知道吗</p>