来自uuu init的变量在一个函数中已更改,但未被识别为已更改为另一个函数

2024-06-26 08:36:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个小帐户注册只是为了学习。 我创建了一个名为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导入,但我想理解为什么没有它,它就不起作用,对我来说毫无意义。 多谢=)


Tags: 函数pyselfinitdeflogin帐户account
2条回答

您需要创建并使用同一个实例来调用这两个方法并获得预期的结果。你知道吗

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

另外,导入Accounts,但在代码中调用Account。你知道吗

您忘记了self.getaccounts()方法的最后一行中的__init__,因此contas保持为空,因为它永远不会被填充。你知道吗


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

__init__是在创建实例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()。你知道吗

您可以通过比较identity和Account(1) is Account(1) # False或查看id号码来检查每次调用Account()时是否获得新对象:

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()你这样做是为了两个不同的目的 实例,而不是在同一个实例上。因此,第二个实例有一个空的contasdict,因为对于这个实例,您之前没有调用getaccounts()。你知道吗

相关问题 更多 >