下方编辑
我阅读了很多有关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
它将返回正确的值。这似乎是一个很好的解决方案。但是,我还是很想听听其他思考这个问题的方法
答案 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]
列表或字典是否更有意义,取决于您的用例。
还要注意,以上假设各种情况,例如由于没有提供该信息,因此您以什么形式从文件中获取数据。