Resumo : neste tutorial, você aprenderá como usar a getattr()
função Python para obter um atributo nomeado de um objeto.
Introdução à função getattr() do Python
A getattr()
função permite obter o valor do atributo nomeado de um objeto. Aqui está a sintaxe da getattr()
função:
getattr(object, name[, default])
Linguagem de código: Python ( python )
A getattr()
função aceita três parâmetros:
object
é o objeto do qual você deseja obter o valor de um atributo nomeado.name
é uma string que especifica o nome do atributo do objeto.default
: se o atributo nomeado não existir no objeto, agetattr()
função retornará o padrão. Se você omitir o padrão e o atributo nomeado não existir, a função gerará umaAttributeError
exceção.
Exemplo de função Python getattr()
O exemplo a seguir ilustra como usar o getattr()
para obter os valores dos atributos de um objeto:
class Member:
def __init__(self, name, email):
self.name = name
self.email = email
member = Member('John Doe', '[email protected]')
name = getattr(member, 'name')
print(name) # 👉 John Doe
email = getattr(member, 'email')
print(name) # 👉 [email protected]
age = getattr(member, 'age')
print(age) # 🛑 AttributeError
Linguagem de código: Python ( python )
Como funciona.
Primeiro, defina uma classe Member
com dois atributos name
e age
:
class Member:
def __init__(self, name, email):
self.name = name
self.email = email
Linguagem de código: Python ( python )
Segundo, crie uma nova instância da Member
classe:
member = Member('John Doe', '[email protected]')
Linguagem de código: Python ( python )
Terceiro, use a getattr()
função para obter os valores do atributo name
and email
:
name = getattr(member, 'name')
print(name) # 👉 John Doe
email = getattr(member, 'email')
print(name) # 👉 [email protected]
Linguagem de código: Python ( python )
É o mesmo que acessar os atributos diretamente:
print(member.name) # 👉 John Doe
print(member.email) # 👉 [email protected]
Linguagem de código: Python ( python )
Finalmente, tente acessar o atributo inexistente age
. Isso gerará uma AttributeError
exceção.
age = getattr(member, 'age')
print(age) # 🛑 AttributeError
Linguagem de código: Python ( python )
Para evitar a exceção, você pode passar None
como valor padrão assim:
age = getattr(member, 'age', None)
Linguagem de código: Python ( python )
Neste caso, age
é None
.
Um exemplo prático da função getattr() do Python
Na prática, você usará a getattr()
função para chamar o método de um objeto dinamicamente. Observe que um método também é um atributo de um objeto.
Suponha que você precise validar o nome e email com as seguintes regras:
name
é necessário, ou seja, seu comprimento é maior que zero.email
é um endereço de e-mail válido
Para fazer isso, você pode criar uma classe Validation reutilizável e usá-la da seguinte maneira:
validation = Validation()
data = {'name': '', 'email': 'test'}
rules = {'name': 'required', 'email': 'email'}
errors = validation.validate(data, rules)
print(errors)
Linguagem de código: Python ( python )
Neste código, data
e rules
são dicionários.
- Cada item no dicionário de dados possui um nome e um valor de campo.
- Cada item no dicionário de regras possui o nome do campo e a regra, que pode ser
required
ouemail
.
O código deve retornar a seguinte saída:
{
'name': 'The name is required',
'email': 'The email is not a valid email address'
}
Linguagem de código: Python ( python )
Vamos desenvolver a Validation
aula.
Primeiro, defina uma Validation
classe:
class Validation:
pass
Linguagem de código: Python ( python )
Segundo, declare as mensagens de erro ( ERRORS
) para as regras required
e email
:
class Validation:
ERRORS = {
'required': 'The {} is required',
'email': 'The {} is not a valid email address'
}
Linguagem de código: Python ( python )
Terceiro, defina o required()
método que retorna True
se o comprimento de um valor for maior que zero e email()
o método que retorna True
se um valor for um endereço de e-mail válido:
import re
class Validation:
ERRORS = {
'required': 'The {} is required',
'email': 'The {} is not a valid email address'
}
def required(self, value):
return len(value) > 0
def email(self, value):
pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
return re.fullmatch(pattern, value)
Linguagem de código: Python ( python )
Para validar um endereço de e-mail, o email()
método usa a fullmatch()
função do módulo (re) expressão regular .
Finalmente, defina o validate()
método:
class Validation:
ERRORS = {
'required': 'The {} is required',
'email': 'The {} is not a valid email address'
}
def required(self, value):
return len(value) > 0
def email(self, value):
pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
return re.fullmatch(pattern, value)
def validate(self, data, rules):
errors = {}
for field, rule in rules.items():
is_valid_method = getattr(self, rule)
if not is_valid_method(data[field]):
errors[field] = self.ERRORS[rule].format(field)
return errors
Linguagem de código: Python ( python )
No validate()
método:
- Inicialize um dicionário de erros para armazenar mensagens de erro.
- Itere as regras do dicionário de regras.
- Para cada regra, use a
getattr()
função para encontrar o método que corresponde à regra. Por exemplo,getattr()
retorna orequired
método para arequired
regra eemail
o método para aemail
regra. - Chame o método dinamicamente para validar os dados. Se o método retornar
False
, adicione a mensagem de erro aoerrors
dicionário. - Devolver o
errors
.
Junte tudo.
import re
class Validation:
ERRORS = {
'required': 'The {} is required',
'email': 'The {} is not a valid email address'
}
def required(self, value):
return len(value) > 0
def email(self, value):
pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
return re.fullmatch(pattern, value)
def validate(self, data, rules):
errors = {}
for field, rule in rules.items():
is_valid_method = getattr(self, rule)
if not is_valid_method(data[field]):
errors[field] = self.ERRORS[rule].format(field)
return errors
validation = Validation()
data = {'name': '', 'email': 'test'}
rules = {'name': 'required', 'email': 'email'}
errors = validation.validate(data, rules)
print(errors)
Linguagem de código: Python ( python )
Saída:
import re
class Validation:
ERRORS = {
'required': 'The {} is required',
'email': 'The {} is not a valid email address'
}
def required(self, value):
return len(value) > 0
def email(self, value):
pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
return re.fullmatch(pattern, value)
def validate(self, data, rules):
errors = {}
for field, rule in rules.items():
is_valid_method = getattr(self, rule)
if not is_valid_method(data[field]):
errors[field] = self.ERRORS[rule].format(field)
return errors
if __name__ == '__main__':
validation = Validation()
data = {'name': '', 'email': 'test'}
rules = {'name': 'required', 'email': 'email'}
errors = validation.validate(data, rules)
print(errors)
Linguagem de código: Python ( python )
Saída:
{
'name': 'The name is required',
'email': 'The email is not a valid email address'
}
Linguagem de código: Python ( python )
Se você passar os dados válidos, os erros ficarão vazios:
# Validation class
if __name__ == '__main__':
validation = Validation()
data = {'name': 'John', 'email': '[email protected]'}
rules = {'name': 'required', 'email': 'email'}
errors = validation.validate(data, rules)
print(errors)
Linguagem de código: Python ( python )
Observe que este código deve conter a Validation
classe para ser executada com sucesso
Saída:
{}
Linguagem de código: Python ( python )
Observe que você pode ocultar o método required()
and email()
tornando-os privados . Neste caso, você também precisa passar a regra prefixada com um sublinhado ( _
) para que a getattr()
função obtenha o método correspondente:
import re
class Validation:
ERRORS = {
'required': 'The {} is required',
'email': 'The {} is not a valid email address'
}
def _required(self, value):
return len(value) > 0
def _email(self, value):
pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
return re.fullmatch(pattern, value)
def validate(self, data, rules):
errors = {}
for field, rule in rules.items():
is_valid_method = getattr(self, f'_{rule}')
if not is_valid_method(data[field]):
errors[field] = self.ERRORS[rule].format(field)
return errors
Observe a seguinte linha de código:
is_valid_method = getattr(self, f'_{rule}')
Linguagem de código: PHP ( php )
Resumo
- Use
getattr()
a função Python para obter o valor de um atributo nomeado de um objeto.