我正在做一个小帐户注册只是为了学习。
我创建了一个名为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)
启动它,但显示了一个空字典,这意味着它没有访问“new”self.contas
。我在一个不同类型的项目中做了完全相同的事情,效果很好,我知道我在这里遗漏了一些非常明显的东西,所以我要为我的疏忽事先道歉。
谢谢你的时间,编得好。你知道吗
EDIT 1
有人要整个节目,这是我的整个节目。我正在使用PyCharm,我创建了一个accounts.py
,一个根文件或资源文件,我将把这个类导入另一个main.py
以使用相应的函数。我知道我必须先调用Accounts().getaccounts()
,然后再调用其他函数,这样我就可以先填充我的“帐户数据库”。即使这样做:
将print(self.contas)
添加到getaccounts()
的结尾和accountsprinting()
的开头
在同一个地方做同样的事
Account().getaccounts()
Account().accountsprinting()
或者在不同的地方做。py:
from AccountManager import Account
Account().getaccounts()
Account().accountsprinting()
输出相同:
{'Bruno': '666', 'Bruno2': '444', 'Pedro': '2222a', 'Breno': '092b'}
{}
EDIT 2
如@Darkonaut所说,将self.getaccounts()
添加到def __init__(self)
确实有效,在同一个.py上,甚至从另一个.py导入,但我想理解为什么没有它,它就不起作用,对我来说毫无意义。
多谢=)
您需要创建并使用同一个实例来调用这两个方法并获得预期的结果。你知道吗
另外,导入
Accounts
,但在代码中调用Account
。你知道吗您忘记了
self.getaccounts()
方法的最后一行中的__init__
,因此contas保持为空,因为它永远不会被填充。你知道吗TL;DR确保保留对新创建实例的引用以使其保持活动状态 并对此实例执行以下方法调用。
__init__
是在创建实例get之后调用的方法 初始化实例。每次都要创建一个类的实例 调用类就像调用Account()
。你知道吗但是如果您不保留对这个新创建的实例的(外部)引用, 不能对实例寻址以调用其上的其他方法。代码中发生了什么:
这两个实例都很快被垃圾收集(假定是Python的CPython实现),因为您不持有对它们的外部引用,就像您将一个新实例分配给如下名称时所做的那样:
acc = Account()
。你知道吗您可以通过比较identity和
Account(1) is Account(1) # False
或查看id
号码来检查每次调用Account()
时是否获得新对象:作为旁注:
它不必像上面的
acc
那样是一个命名引用,您还可以持有 隐式的、未命名的引用,例如,通过将新实例放置在列表中,列表将保留对实例的引用,从而使它们保持活动状态:self
在代码中是连接(绑定)类和实例的(内部)引用。 如果像在实例方法getaccounts
中对self.contas[login] = senha
所做的那样分配给self
,那么只对调用getaccounts
的实际实例执行此操作。所以当你打电话给Account().getaccounts()
和 稍后Account().accountsprinting()
你这样做是为了两个不同的目的 实例,而不是在同一个实例上。因此,第二个实例有一个空的contas
dict,因为对于这个实例,您之前没有调用getaccounts()
。你知道吗相关问题 更多 >
编程相关推荐