我想不出一个方法来避免这个cas中的动态变量

2024-09-30 06:11:55 发布

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

编辑下方

我读了很多关于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个成员,将创建5个对象,我想将它们命名为member1、member2等。但是,在访问该文件时,这会造成混淆,因为很难区分它们,因此我将它们添加到字典中,并将其memberID作为键:

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

这就产生了一个类似这样的字典:

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

python的有趣之处在于,dictionary值不需要是值,它可以是对象。这对我来说是新事物,来自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)

但是,“+”运算符在组合名称时仅适用于字符串,而不适用于标识符。因此不能工作(我想)。你知道吗

我读到的许多解决方案都表明,在这种情况下,我应该使用字典或列表。但是,由于我的变量指向一个类对象,所以我想不出一种使用list/dictionary作为实现的方法。你知道吗

我目前的解决方案是使用元组存储成员信息,然后在其他地方进行计算(即,我取出类方法并将它们定义为函数),这样字典看起来像这样:

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

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


Tags: 文件the对象方法nameself信息dictionary
2条回答

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

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

你会得到你想要的词典。你知道吗

看来你的更新是对的。你知道吗

我不清楚您的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理解来完成上述操作,这些理解基本上只是针对循环进行压缩。你知道吗

听写理解

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

列表理解

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

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

另外请注意,上面假设了各种情况,例如,从文件中获取数据的形式,因为您没有提供这些信息。你知道吗

相关问题 更多 >

    热门问题