在这种情况下,我无法想到避免动态变量的方法

时间:2019-05-20 06:08:04

标签: python python-3.x

下方编辑

我阅读了很多有关python中动态变量的讨论,并且已经表明它们是您通常不应该做的事情。但是我有一种情况,我真的想不出办法避免它(以及为什么我在这里)

我当前正在读取一个文本文件,该文件存储了商店中不同成员的信息。每个成员都有自己的信息:例如他们的电话号码,电子邮件,帐户中的积分等。我想创建一个类和对象来存储此信息。别担心,这只是工作的一部分,他们不是真实的人。这是示例代码:

class Member:
    def __init__(self, name, phoneNumber, email, points):
        self.name = name
        self.phoneNumber = phoneNumber
        self.email = email
        self.points = points
        self.totalPointsSpent = 0

    #There are methods below that will return some calculated results, like total points
    spent or their ranking. I will not show those here as they are irrelevant

然后将读取文件中的每个成员并从中创建一个对象。例如,如果该文件中有5个成员,则将创建五个对象,我想将它们命名为member1,member2等。但是,由于很难区分它们,因此在访问它时会造成混淆。我将它们添加到字典中,以它们的memberID作为键:

dictonary[memberID] = member1
dictonary[memberID] = member2 #and so on

这将导致字典看起来像这样:

dictionary = {'jk1234':member1,'gh5678':member2,...#etc}

这是有关python的有趣事情,因为字典值不需要是值,它可以是对象。对我来说,这是来自Java的新东西。

但是,这是第一个问题。我不知道文件中有多少个成员,或者我应该说,文件中的成员数因文件而异。如果数字为5,则需要5个变量;如果有8,我需要8,依此类推。我已经考虑过使用while循环,并且代码将如下所示:

a = len(#the number of members in the file.)
i = 0
while i <= a:
    member + i = Member(#pass in the information)

,但是'+'运算符仅在组合名称时适用于字符串,不适用于标识符。因此无法正常工作(我认为)。

我阅读的许多解决方案都表明,在这种情况下,我应该使用字典或列表。但是,由于我的变量指向类对象,因此我无法想到使用列表/字典作为实现的方法。

我当前的解决方案是使用元组存储成员信息,并在其他地方进行计算(即,我取出类方法并将其定义为函数),以便字典如下所示:

dictionary = {'jk1234': (name, phoneNumber, email, points),'gh5678':(name, phoneNumber, email, points),...#etc}

但是,鉴于我需要传递的信息量并不理想。我当前的算法可以工作,但是我想对其进行优化并使其更加封装。

如果您走了这么远,我将不胜感激,并想知道是否有更好的算法可以解决此问题。请原谅我不到一年的Python经验。

编辑:好吧,我刚刚发现了一些非常有趣的东西,对于有经验的Python程序员来说,这些东西似乎很基础。也就是说,您可以在字典中传递值,而不必专门命名变量。对于我的问题,应该是:

dictionary = {'jk1234': Member(name, phoneNumber, email, points),'gh5678':Member(name, phoneNumber, email, points),...#etc}
#and they are retrievable:
dictionary['jk1234'].get_score() #get_score is a getter function inside the class

它将返回正确的值。这似乎是一个很好的解决方案。但是,我还是很想听听其他思考这个问题的方法

2 个答案:

答案 0 :(得分:0)

您可以使用for循环创建字典:

d = {}
for i in the_members_in_the_file:
    d[i] = Member(your, parameters, that\'s, inputted)

您将获得预期的字典。

答案 1 :(得分:0)

您的更新似乎在正确的轨道上。

我不清楚您的MemberID是否是每个成员的值,但是如果是,则可以在创建对象的循环中使用它

d = {}

for member in members_file:
    d[MemberID] = Member(name, phoneNumber, email, points)

这当然假定MemberID是唯一的,否则您将覆盖现有条目。

您也可以使用列表

l = []
for member in members_file:
    l.append(Member(name, phoneNumber, email, points))

此外,您还可以对list / dict理解进行上述操作,这些基本上只是压缩的for循环。

词典理解

d = {MemberID: Member(name, phoneNumber, email, points) for member in members_file}

列表理解

l = [Member(name, phoneNumber, email, points) for member in members_file]

列表或字典是否更有意义,取决于您的用例。

还要注意,以上假设各种情况,例如由于没有提供该信息,因此您以什么形式从文件中获取数据。