Sup,我正在做一个小帐户注册只是为了学习建议。
我创建了一个名为Accounts的类,并使用了许多不同的函数。通过之前的确认,我知道我需要从名为def __init__(self)
class Account:
def __init__(self):
self.contas = {}
self.bancodecontas = open("x.txt", 'r')
def getaccounts(self):
for linha in self.bancodecontas:
linha = linha.strip()
conta = linha.split(",")
login = conta[0]
senha = conta[1]
self.contas[login] = senha
def accountsprinting(self):
for login, senha in self.contas.items():
print("Login= ", login, "Senha= ", senha)
getaccounts()
工作正常,我在其末尾测试了一个print(self.contas)
,它打印了我x.txt内的所有帐户。当我需要拨打accountsprinting()
时,问题就开始了,我尝试用print(self.contas)
启动它但是向我显示一个空字典,这意味着它没有访问“新”self.contas
。我在一个不同类型的项目中做了完全相同的事情并且工作正常,我知道我在这里遗漏了一些非常明显的事情,所以我事先要求对不起,因为我缺乏关注。
谢谢你的时间,好的编码。
编辑1
人们要求整个计划,这是我的整个计划。我正在使用PyCharm,我将其创建为accounts.py
,根文件或资源文件,我将要将此类导入另一个main.py
以使用相应的函数。我知道我必须先调用Accounts().getaccounts()
,然后我必须调用其他函数,所以我可以先填写我的“帐户数据库”。即使这样做:
将print(self.contas)
添加到getaccounts()
的末尾和accountsprinting()
的开头
做同样的.py:
Account().getaccounts()
Account().accountsprinting()
或者使用不同的.py:
from AccountManager import Account
Account().getaccounts()
Account().accountsprinting()
输出相同:
{'Bruno': '666', 'Bruno2': '444', 'Pedro': '2222a', 'Breno': '092b'}
{}
编辑2
将self.getaccounts()
添加到def __init__(self)
,因为@Darkonaut说,真的有效,在同一个.py甚至从另一个.py进行导入,但我想理解为什么没有它,它不会工作,对我没用。
非常感谢=)
答案 0 :(得分:2)
您需要创建并使用相同的实例来调用具有预期结果的两种方法。
acc = Account()
accounts = acc.getaccounts()
acc.accountsprinting()
此外,您导入了Accounts
,但在代码中调用了Account
。
答案 1 :(得分:1)
您在self.getaccounts()
方法的最后一行忘记了__init__
,因此contas仍为空,因为它永远不会被填充。
TL; DR确保您保留对新创建的实例的引用以使其保持活动状态 并在此实例上执行以下方法调用。
__init__
是在创建实例后调用的方法
并初始化实例。您每次都创建一个类的实例
你像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实现),因为你没有对它们进行外部引用,就像你为一个名称分配一个新实例一样:{{1} }。
每次通过将身份与acc = Account()
进行比较或通过查看Account()
数字来确认Account(1) is 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
中分配self
,就像使用self.contas[login] = senha
一样,那么只对您调用的实际实例执行此操作getaccounts
1}}。所以当你致电getaccounts
和
后来Account().getaccounts()
你这两个不同的人
实例而不是相同的。因此,第二个实例有一个空的Account().accountsprinting()
字典,因为对于此实例,您之前没有调用contas
。