Python 来自_init_uu的变量在一个函数中更改,但未被识别为已更改为其他函数
我正在做一个小小的帐户注册,只是为了学习。 我创建了一个名为Accounts的类,并使用了许多不同的函数。在之前的确认中,我知道我需要从一个名为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
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()
,都会创建一个新实例,所以每次都会在单独的实例上调用这些方法。实例化一个accountaccount=account()
,然后对它执行所有后续方法调用:account.getaccounts()
等等……然后我执行account=account(),我想说account.getaccounts()和account.accountsprint()在同一个实例上,如果我不执行,则是getaccounts()将发生在某种类型的“Instance1”上,accountsprinting()将发生在“Instance2”上,因此在Instance2上,我的数据库是空的Tanks,我对其进行了编辑,您能看到我对上述答案的最后评论吗?我评论了我对它的理解,如果我是对的,你能说吗?
acc = Account()
accounts = acc.getaccounts()
acc.accountsprinting()