【问题标题】:Python- creating object instances in a loop with independent handlingPython-在具有独立处理的循环中创建对象实例
【发布时间】:2015-05-24 06:10:43
【问题描述】:

我有一个简单的选举程序。以下是要求:

  1. class Politician
  2. 随机投票。
  3. 将政治家的数量作为用户的输入。

    num_politicians = input("The number of politicians: ")
    
  4. 循环和创建实例

    names = []
    for x in range(num_politicians):
        new_name = input("Name: ")
        while new_name in names:
            new_name = input("Please enter another name: ")
        names.append(new_name)
    
        #### This part is the crux of my problem
        ### Create instances of the Politician class
        #### I want to do this in a way so that i can independently 
        #### handle each instance when i randomize and assign votes
    

我看过:

  1. How do you create different variable names while in a loop? (Python)
  2. Python: Create instance of an object in a loop

但是我找不到解决问题的方法

政客类如下:

class Politician:

    def __init__(self, name):
        self.name = str(name)
        self.age = age
        self.votes = 0

    def change(self):
        self.votes = self.votes + 1

    def __str__(self):
        return self.name + ": " + str(self.votes)

所需的输出:

>>> The Number of politicians: 3
>>> Name: John
>>> Name: Joseph
>>> Name: Mary
>>> Processing...
(I use time.sleep(1.0) here)
>>> Mary: 8 votes
>>> John: 2 votes
>>> Joseph: 1 vote

我的问题在一个陈述中

我想在 for 循环中创建类实例,以便我可以随机分配投票(我想这需要我独立处理实例。)

任何帮助将不胜感激。

【问题讨论】:

  • 我不明白这个问题,从语义上讲,实例是独立的。

标签: python class instances


【解决方案1】:

您可以将实例存储在列表中:

politicians = []
for name in 'ABC':
    politicians.append(Politician(name))

现在您可以访问单个实例:

>>> politicians[0].name
'A'

我使用了你的课程的修改版本,如果没有提供,则给每个政治家一个默认年龄:

class Politician:

    def __init__(self, name, age=45):
        self.name = str(name)
        self.age = age
        self.votes = 0

    def change(self):
        self.votes = self.votes + 1

    def __str__(self):
        return self.name + ": " + str(self.votes)

现在您可以使用您的政客名单:

print('The Number of politicians: {}'.format(len(politicians)))

打印:

The Number of politicians: 3

这个:

for politician in politicians:
    print(politician)

打印:

A: 0
B: 0
C: 0

随机投票:

import random

for x in range(100):
    pol = random.choice(politicians)
    pol.votes += 1

现在:

for politician in politicians:
    print(politician)

打印:

A: 35
B: 37
C: 28

整个程序:

# Assuming Python 3.

class Politician:

    def __init__(self, name, age=45):
        self.name = str(name)
        self.age = age
        self.votes = 0

    def change(self):
        self.votes = self.votes + 1

    def __str__(self):
        return '{}: {} votes'.format(self.name, self.votes)

num_politicians = int(input("The number of politicians: "))
politicians = []
for n in range(num_politicians):
    if n == 0:
        new_name = input("Please enter a name: ")
    else:
        new_name = input("Please enter another name: ")
    politicians.append(Politician(new_name))

print('The Number of politicians: {}'.format(len(politicians)))
for politician in politicians:
    print(politician)

print('Processing ...')
for x in range(100):
    pol = random.choice(politicians)
    pol.votes += 1

for politician in politicians:
    print(politician)

及用法:

The number of politicians: 3
Please enter a name: John
Please enter another name: Joseph
Please enter another name: Mary
The Number of politicians: 3
John: 0 votes
Joseph: 0 votes
Mary: 0 votes
Processing ...
John: 25 votes
Joseph: 39 votes
Mary: 36 votes

更新

正如@martineau 所建议的那样,对于现实生活中的问题,字典会更多 有用。

创建字典而不是列表:

politicians = {}

当您添加实例时,在循环中我们将名称作为键:

politicians[new_name] = Politician(new_name)

【讨论】:

  • 我建议将Politician 实例存储在字典中,并键入他们的名字,因为在现实生活中,投票是如何投票的(而不是从他们的列表中随机选择一个)。
  • @martineau 同意。在我的答案中添加了一些建议这种改进的行。
猜你喜欢
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
相关资源
最近更新 更多