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

时间:2018-01-22 19:33:14

标签: python function class dictionary object-oriented-database

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进行导入,但我想理解为什么没有它,它不会工作,对我没用。 非常感谢=)

2 个答案:

答案 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