Функция setattr() в Python: использование, параметры и примеры
В этом уроке рассмотрим, как использовать функцию Python setattr() для установки значения атрибута объекта, ее параметры и примеры.
- Введение в функцию Python setattr()
- Примеры функции setattr() в Python
- 1) Установка значения атрибута объекта
- 2) Использование Python setattr() для назначения метода объекту
- Использование setattr() для преобразования словаря в объект
Введение в функцию Python setattr()
Функция setattr() устанавливает значение атрибута, указанного строковым именем объекта. Ниже показан синтаксис функции setattr():
setattr(object, name, value)
Функция setattr() имеет следующие параметры:
- object — объект, которому вы хотите задать атрибут.
- name — имя атрибута, которому вы хотите присвоить значение.
- value — это значение, которое необходимо установить.
На практике вы будете использовать функцию setattr() в Metal-программировании. Пожалуйста, ознакомьтесь с классом Meta и его примером для практического использования функции setattr().
Примеры функции setattr() в Python
Давайте рассмотрим несколько примеров использования функции setattr().
1) Установка значения атрибута объекта
В следующем примере определяется класс Person и используется setattr() для присвоения значения атрибуту age:
class Person: def __init__(self, name): self.name = name person = Person('John') setattr(person, 'age', 22) print(person.__dict__)
Выход:
{'name': 'John', 'age': 22}
В этом примере класс Person не имеет атрибута age. Setattr() добавляет атрибут age к объекту person и устанавливает его значение равным 22.
Обратите внимание, что setattr() изменяет только отдельный объект person, а не класс Person. Если вы создадите еще один экземпляр класса Person, этот объект не будет иметь атрибута age. Например:
class Person: def __init__(self, name): self.name = name person = Person('John') setattr(person, 'age', 22) print(person.__dict__) # {'name': 'John', 'age': 22} person2 = Person('Jane') print(person2.__dict__) # {'name': 'Jane'}
2) Использование Python setattr() для назначения метода объекту
В следующем примере функция setattr() используется для назначения функции объекту:
class Person: def __init__(self, name): self.name = name def say_hi(): return 'Hi' person = Person('John') setattr(person, 'greeting', say_hi) print(person.greeting())
Как это работает.
- Сначала определим класс Person:
class Person: def __init__(self, name): self.name = name
- Во-вторых, определите функцию say_hi():
def say_hi(): return 'Hi'
- В-третьих, создайте новый объект Person и назначьте функцию say_hi атрибуту приветствия объекта person:
person = Person('John') setattr(person, 'greeting', say_hi)
- Наконец, вызовите функцию say_hi() через атрибут greeting():
print(person.greeting())
Выход:
Hi
Использование setattr() для преобразования словаря в объект
При работе со словарем, особенно со множеством вложенных словарей, необходимо использовать квадратные скобки с ключами, окруженными строкой. Например:
person_dict = { 'first_name': 'John', 'last_name': 'Doe', 'skills': ['Python', 'Tkinter', 'Django'], 'address': { 'house_no': 999, 'street': 'Fox Avenue', 'city': 'San Jose', 'state': 'CA', 'zipcode': 95134, 'country': 'USA' } }
Чтобы получить значение имени словаря person_dict, необходимо использовать строку «first_name» в качестве ключа:
person_dict['first_name']
Чтобы получить значение состояния person_dict, вам необходимо сначала получить доступ к адресу, а затем использовать строку «state» в качестве ключа:
person_dict['address']['state']
Было бы удобнее получить доступ к состоянию как к объекту, например:
person_dict.address.state
Для этого вам нужно преобразовать словарь в объект. Ключ каждой пары ключ/значение в словаре является атрибутом объекта. Также вам нужно разобраться с вложенными словарями.
Следующий класс DictToObject использует функцию setattr() и рекурсивный метод для преобразования словаря в объект:
class DictToObject: def __init__(self, d): if not isinstance(d, dict): raise ValueError('The argument d must be a dictionary object') for key, value in d.items(): if isinstance(value,(list, tuple)): setattr(self, key, [DictToObject(v) if isinstance(v, dict) else v for v in value]) else: setattr(self, key, DictToObject(value) if isinstance(value, dict) else value)
Ниже показано, как преобразовать person_dict в объект person с помощью класса DictToObject:
class DictToObject: def __init__(self, d): if not isinstance(d, dict): raise ValueError('The argument d must be a dictionary object') for key, value in d.items(): if isinstance(value,(list, tuple)): setattr(self, key, [DictToObject(v) if isinstance(v, dict) else v for v in value]) else: setattr(self, key, DictToObject(value) if isinstance(value, dict) else value) if __name__ == '__main__': person_dict = { 'first_name': 'John', 'last_name': 'Doe', 'skills': ['Python', 'Tkinter', 'Django'], 'address': { 'house_no': 999, 'street': 'Fox Avenue', 'city': 'San Jose', 'state': 'CA', 'zipcode': 95134, 'country': 'USA' } } person = DictToObject(person_dict) print(person.first_name) # John print(person.address.state) # CA