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
função define a setattr()
value
como um atributo especificado pela string name
de an object
. O seguinte mostra a sintaxe da
função:setattr()
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
função na programação de metal. Confira a classe Meta e seu exemplo para o uso prático da setattr()
função.setattr()
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 Person
classe e usa setattr()
para atribuir um valor ao age
atributo:
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 Person
classe não possui o age
atributo. setattr()
Adiciona o atributo age
ao objeto person e define seus valores como 22.
Observe que isso setattr()
altera apenas um person
objeto individual, não a Person
classe. 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 Person
classe:
class Person:
def __init__(self, name):
self.name = name
Linguagem 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 Person
objeto e atribua a say_hi
função ao greeting
atributo do person
objeto:
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:
Hi
Linguagem 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_dict
dicioná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.state
Linguagem 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 DictToObject
classe 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_dict
para o person
objeto usando a DictToObject
classe:
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
Linguagem de código: Python ( python )
Resumo
- Use a função Python
setattr()
para definir um valor para um atributo de um objeto.