Python создает экземпляр класса с помощью манипулирования строками

#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, также будут напечатаны.