#python #python-3.x #loops
#python #python-3.x #циклы
Вопрос:
Я написал класс и создал два списка. Первый для пользователей, а второй для пользовательских атрибутов.
Теперь я хотел бы перебрать два списка, чтобы создать несколько экземпляров класса с соответствующими данными.
class Employee:
def __init__(self, first, last, pay):
self.first = first
self.last = last
self.pay = pay
self.email = first '.' last '@company.com'
emp_1 = Employee('Corey', 'Schafer', '50000')
emp_2 = Employee('Test', 'User', '60000')
печатая, print(amp_1.email)
я могу создать экземпляр класса:
будет выводить Corey.Schafer@company.com
Теперь я не хочу записывать его вручную, поэтому я хочу выполнить цикл через него:
for user in users:
for user_atr in user_atrs:
print(user '.' user_atr)
будет выводить:
empy_1.first
empy_1.last
empy_1.pay
empy_1.email
empy_2.first
empy_2.last
empy_2.pay
empy_2.email
Вместо:
Corey
Schafer
50000
Corey.Schafer@email.com
Test
User
60000
Test.User@email.com
Как я могу использовать этот цикл для фактического создания экземпляра класса, а не только схемы элементов?
Ответ №1:
Базовое решение
- список
string
пользователей :['emp_1', 'emp_2']
- список
string
, который является именем атрибута['first', 'last', 'pay', 'email']
Затем используйте встроенный метод globals()
для получения переменной и getattr(obj, name, default)
, но это нехорошо и требует ввода имен переменных
emp_1 = Employee('Corey', 'Schafer', 50000)
emp_2 = Employee('Test', 'User', '60000')
for user in ['emp_1', 'emp_2']:
for user_atr in ['first', 'last', 'pay', 'email']:
print(getattr(globals()[user], user_atr))
Лучшее решение
- список
Employee
экземпляров :[emp_1, emp_2]
- Доступ к свойствам объекта с
__dict__
помощью (key
имя,value
значение свойства)
for user in [emp_1, emp_2]:
for user_atr in user.__dict__.values():
print(user_atr)
Corey
Schafer
50000
Corey.Schafer@company.com
...
Для одновременного чтения имени и значения
for user in [emp_1, emp_2]:
for user_atr in user.__dict__.items():
print(user_atr)
('first', 'Corey')
('last', 'Schafer')
('pay', 50000)
('email', 'Corey.Schafer@company.com')
...
Комментарии:
1. Господи, я этого не делал. Я был полностью слеп. Извините!! Конечно
Ответ №2:
class Employee:
def __init__(self, first, last, pay):
self.first = first
self.last = last
self.pay = pay
self.email = first '.' last '@company.com'
emp_1 = Employee('Corey', 'Schafer', '50000')
emp_2 = Employee('Test', 'User', '60000')
users = {"emp_1": emp_1,
"emp_2": emp_2}
for user in users.values():
for attribute in list(user.__dict__.keys()):
print(f"{name}.{attribute}")
Это сделает это за вас, сохранив пользователей в словаре с именем пользователя в качестве ключа словаря, а затем используя __dict__
атрибут из Employee
класса для получения словаря всех атрибутов, а затем распечатав имя каждого атрибута из этого словаря.
Если вы пытаетесь напечатать значение каждого из этих атрибутов, его можно изменить на следующее:
users = {"emp_1": emp_1,
"emp_2": emp_2}
for name, user in users.items():
for attribute in list(user.__dict__.keys()):
print(getattr(user,attribute))
Использование этого метода означает, что все дополнительные атрибуты, добавленные к классу employee, также будут напечатаны.