Python 来自_init_uu的变量在一个函数中更改,但未被识别为已更改为其他函数

Python 来自_init_uu的变量在一个函数中更改,但未被识别为已更改为其他函数,python,function,class,dictionary,object-oriented-database,Python,Function,Class,Dictionary,Object Oriented Database,我正在做一个小小的帐户注册,只是为了学习。 我创建了一个名为Accounts的类,并使用了许多不同的函数。在之前的确认中,我知道我需要从一个名为def\uuuu init\uuuuu(self) getaccounts()工作正常,最后我测试了一个print(self.contas),它从x.txt内部打印了所有帐户。当我需要调用accountsprint()时,问题开始了,我试图用print(self.contas)启动它,但显示了一个空字典,这意味着它没有访问“new”self.contas

我正在做一个小小的帐户注册,只是为了学习。 我创建了一个名为Accounts的类,并使用了许多不同的函数。在之前的确认中,我知道我需要从一个名为
def\uuuu init\uuuuu(self)

getaccounts()
工作正常,最后我测试了一个
print(self.contas)
,它从x.txt内部打印了所有帐户。当我需要调用
accountsprint()
时,问题开始了,我试图用
print(self.contas)
启动它,但显示了一个空字典,这意味着它没有访问“new”
self.contas
。我在一个不同类型的项目中做了完全相同的事情,效果很好,我知道我在这里遗漏了一些非常明显的东西,所以我要为我的疏忽事先道歉。 谢谢你的时间,祝你好运

编辑1

人们要求整个计划,这是我的整个计划。我正在使用PyCharm,我创建了一个
accounts.py
,一个根文件或资源文件,我将把这个类导入另一个
main.py
,以使用相应的函数。我知道我必须先调用
Accounts().getaccounts()
,然后我必须调用其他函数,这样我才能首先填充我的“Accounts数据库”。即使这样做:

print(self.contas)
添加到
getaccounts()的末尾和
accountsprint()的开头

在同一个平台上执行。py:

Account().getaccounts()
Account().accountsprinting()
或者在不同的.py上执行:

from AccountManager import Account
Account().getaccounts()
Account().accountsprinting()
输出相同:
{'Bruno':'666','Bruno2':'444','Pedro':'2222a','Breno':'092b'}
{}

编辑2

正如@Darkonaut所说,在相同的.py上添加
self.getaccounts()
def\uuuuu init\uuuuuuu(self)
,甚至从另一个.py导入,都非常有效,但我想理解为什么没有它,它就不起作用,对我来说毫无意义。
非常感谢=)

您忘记了
\uuuu init\uuuu
方法的最后一行中的
self.getaccounts()
,因此contas保持为空,因为它从未被填充


TL;DR请确保保留对新创建实例的引用以使其保持活动状态 并在此实例上执行以下方法调用。

\uuuu init\uuuu
是在创建实例get后调用的方法 并初始化实例。每次创建一个类的实例 您可以像调用
Account()
那样调用类

但是如果不保留对这个新创建的实例的(外部)引用, 您无法寻址实例以调用其上的其他方法。代码中发生了什么:

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
这两个实例都会被快速垃圾收集(假定为Python的CPython实现),因为您不会像为新实例分配一个名称(如:
acc=Account()
)时那样持有对它们的外部引用

每次调用
Account()
时,您可以通过比较身份与
Account(1)是否为Account(1)#False
或查看
id
编号来检查是否获得了一个新对象:

id(Account(1))
# 88311904
id(Account(1))
# 88312408
作为旁注:

它不必像上面的
acc
那样是命名的引用,您也可以持有 隐式的、未命名的引用,例如,通过将新实例放置在列表中,列表将保留对实例的引用,从而使它们保持活动状态:

class Account:
    def __init__(self, x):
        self.x = x

lst = [Account(1), Account(2)]
lst[0].x
# 1
lst[1].x
# 2

self
在代码中是连接(绑定)类和实例的(内部)引用。 如果您在实例方法
getaccounts
中像对待
self.contas[login]=senha
那样分配给
self
,那么您只能对调用
getaccounts
的实际实例执行此操作。因此,当您调用
Account().getaccounts()
和 稍后
Account().accountsprinting()
您将为两个不同的客户执行此操作
实例,而不是在同一个实例上。因此,第二个实例有一个空的
contas
dict,因为对于这个实例,您以前没有调用
getaccounts()

您需要创建并使用同一个实例来调用这两个方法,以获得预期的结果

acc = Account()
accounts = acc.getaccounts()
acc.accountsprinting()

此外,您导入
帐户
,但在代码中调用
帐户

请提供一个简短完整的程序来演示错误。有关更多信息,请参阅。例如,当我创建时,它工作正常。由于您发布的代码工作正常,问题一定在于您没有发布的代码。在初始化新对象后,他仍然可以调用
getaccounts()
。由于他没有显示完整的程序,我猜他不是在创建一个对象,而是直接从类调用方法。@如果他这样做,他可能不必担心空的contas,除非文件是空的。当然,这是可行的,但正如@AMagoon所说,我仍然可以调用getaccounts()然后在调用accountsprint()之后,它应该可以工作了,我的问题是,为什么accountsprint()不使用getaccounts()所做的新self.contas@Bruno Cerk每次调用
Account()
,都会创建一个新实例,所以每次都会在单独的实例上调用这些方法。实例化一个account
account=account()
,然后对它执行所有后续方法调用:
account.getaccounts()
等等……然后我执行account=account(),我想说account.getaccounts()和account.accountsprint()在同一个实例上,如果我不执行,则是getaccounts()将发生在某种类型的“Instance1”上,accountsprinting()将发生在“Instance2”上,因此在Instance2上,我的数据库是空的Tanks,我对其进行了编辑,您能看到我对上述答案的最后评论吗?我评论了我对它的理解,如果我是对的,你能说吗?
acc = Account()
accounts = acc.getaccounts()
acc.accountsprinting()