Создание переменной из строкового ключа внутри словаря - PullRequest
0 голосов
/ 14 июля 2020

У меня есть класс:

class Employee():
    raise_amount = 1.05
    def __init__(self, first, last, pay):
        self.first = first
        self.last = last
        self.pay = pay
    
    def apply_raise(self):
        self.pay = int(self.pay * self.raise_amount)
        print(self.pay)

Я могу создать экземпляр объекта следующим образом:

emp_1 = Employee('John', 'Doe', 10000)

У меня есть словарь:

b = {'first':['John', 'Doe', 10000], 'second' : ['Danis', 'Jones', 20000]}

Я хочу для создания экземпляров двух объектов, first и second из словаря b со значениями, которые они содержат.

Я пробовал:

for k,v in b.items():
    k = Employee(v[0],v[1],v[2])
first.pay

NameError: name 'first' не определено

Как я могу добиться создания объектов из словаря, в котором ключом является имя переменной экземпляра класса, а параметрами - значения, которые содержит каждый ключ?

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Есть одна вещь, которую вы делаете неправильно, помимо вашего требования создавать переменные из этого словаря b. Попробуйте следующее:

for k,v in b.items():
    b[k] = Employee(v[0],v[1],v[2])
print(b['first'].pay)

Это даст результат 10000. Выполнение k = Employee(v[0],v[1],v[2]) внутри for l oop не изменяет сам словарь b.

Если вы не хотите изменять словарь b, но хотите ввести ключи и их соответствующие значения экземпляра как локальные переменные, вы можете попробовать следующее (но это не рекомендуется):

b = {'first':['John', 'Doe', 10000], 'second' : ['Danis', 'Jones', 20000]}
c = {}
for k,v in b.items():
    c[k] = Employee(*v)
locals().update(c)
print(first.pay)
print(second.pay)

Вывод:

10000
20000
0 голосов
/ 14 июля 2020

Если вы не против создать новую коллекцию , возможно, вам может пригодиться следующее:

all_employees = []
for _, v in b.items():
    all_employees.append(Employee(v[0], v[1], v[2]))

for e in all_employees:
    print("first: ", e.first)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...