Функция setattr() в Python: использование, параметры и примеры

В этом уроке рассмотрим, как использовать функцию Python 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

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *