Python — создание экземпляров объекта в цикле с независимой обработкой

У меня есть простая предвыборная программа. Требования следующие:

  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. Как вы создаете разные имена переменных, пока в петле? (Питон)
  2. Python: создание экземпляра объекта в цикле

Однако я не мог найти решение своей проблемы

Класс "Политик" находится ниже:

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 таким образом, чтобы я мог назначать им голоса случайным образом (это, я полагаю, потребует от меня независимой обработки экземпляров).

Любая помощь будет оценена по достоинству.


person AkaiShuichi    schedule 24.05.2015    source источник
comment
Я не понимаю вопроса, по смыслу экземпляр независим.   -  person marcadian    schedule 24.05.2015


Ответы (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)
person Mike Müller    schedule 24.05.2015
comment
Я бы предложил хранить экземпляры Politician в словаре с указанием их имени, поскольку в реальной жизни это то, как подаются голоса (в отличие от случайного выбора одного из них). - person martineau; 24.05.2015
comment
@martineau Согласен. В мой ответ добавлено несколько строк, предлагающих это улучшение. - person Mike Müller; 24.05.2015