Conjunto Python – 03

Resumo : neste tutorial, você aprenderá como usar a setattr()função Python para definir um valor para um atributo de um objeto.

Introdução à função setattr() do Python

A setattr()função define a valuecomo um atributo especificado pela string namede an object. O seguinte mostra a sintaxe da setattr()função:

setattr(object, name, value)Linguagem de código:  Python  ( python )

A setattr()função possui os seguintes parâmetros:

  • objecté o objeto cujo atributo você deseja definir.
  • nameé o nome do atributo cujo valor você deseja definir.
  • valueé o valor a ser definido.

Na prática, você usará a setattr()função na programação de metal. Confira a classe Meta e seu exemplo para o uso prático da setattr()função.

Exemplos de funções setattr() em Python

Vejamos alguns exemplos de uso da setattr()função.

1) Usando Python setattr() para definir um valor para um atributo de um objeto

O exemplo a seguir define uma Personclasse e usa setattr()para atribuir um valor ao ageatributo:

class Person:
    def __init__(self, name):
        self.name = name


person = Person('John')
setattr(person, 'age', 22)

print(person.__dict__)Linguagem de código:  Python  ( python )

Saída:

{'name': 'John', 'age': 22}Linguagem de código:  Python  ( python )

Neste exemplo, a Personclasse não possui o ageatributo. setattr()Adiciona o atributo ageao objeto person e define seus valores como 22.

Observe que isso setattr()altera apenas um personobjeto individual, não a Personclasse. Se você criar outra instância da classe Person, este objeto não terá o atributo idade. Por exemplo:

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'}Linguagem de código:  Python  ( python )

2) Usando Python setattr() para atribuir um método a um objeto

O exemplo a seguir usa a setattr()função para atribuir uma função a um objeto:

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())Linguagem de código:  Python  ( python )

Como funciona.

Primeiro, defina uma Personclasse:

class Person:
    def __init__(self, name):
        self.name = nameLinguagem de código:  Python  ( python )

Em segundo lugar, defina a say_hi()função:

def say_hi():
    return 'Hi'Linguagem de código:  Python  ( python )

Terceiro, crie um novo Personobjeto e atribua a say_hifunção ao greetingatributo do personobjeto:

person = Person('John')
setattr(person, 'greeting', say_hi)Linguagem de código:  Python  ( python )

Finalmente, chame a say_hi()função através do greeting()atributo:

print(person.greeting())Linguagem de código:  Python  ( python )

Saída:

HiLinguagem de código:  Python  ( python )

Usando setattr() para converter um dicionário em um objeto

Ao trabalhar com um dicionário, especialmente aquele que possui muitos dicionários aninhados, você precisa usar colchetes com chaves cercadas por uma string. Por exemplo:

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'
    }
}Linguagem de código:  Python  ( python )

Para obter o valor do primeiro nome do person_dictdicionário, você precisa usar a 'first_name'string como chave:

person_dict['first_name']Linguagem de código:  Python  ( python )

Para obter o valor do estado de person_dict, você precisa primeiro acessar o endereço e depois usar a 'state'string como chave:

person_dict['address']['state']Linguagem de código:  CSS  ( css )

Seria mais conveniente acessar o estado como um objeto como este:

person_dict.address.stateLinguagem de código:  Python  ( python )

Para fazer isso, você precisa converter o dicionário em um objeto. A chave de cada par chave/valor no dicionário é o atributo do objeto. Além disso, você precisa lidar com os dicionários aninhados.

A DictToObjectclasse a seguir usa a setattr()função e a técnica recursiva para converter um dicionário em um objeto:

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)
Linguagem de código:  Python  ( python )

O seguinte mostra como converter person_dictpara o personobjeto usando a DictToObjectclasse:

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)  # CALinguagem de código:  Python  ( python )

Resumo

  • Use a função Python setattr()para definir um valor para um atributo de um objeto.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *