Resumo : neste tutorial, você aprenderá sobre o decorador de propriedades Python (@property) e, mais importante, como ele funciona.
Introdução ao decorador de propriedades Python
No tutorial anterior, você aprendeu como usar a classe de propriedade para adicionar uma propriedade a uma classe. Aqui está a sintaxe da property
classe:
class property(fget=None, fset=None, fdel=None, doc=None)
Linguagem de código: Python ( python )
O seguinte define uma Person
classe com dois atributos name
e age
:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
Linguagem de código: Python ( python )
Para definir um getter para o age
atributo, você usa a property
classe assim:
class Person:
def __init__(self, name, age):
self.name = name
self._age = age
def get_age(self):
return self._age
age = property(fget=get_age)
Linguagem de código: Python ( python )
O property
aceita um getter e retorna um objeto de propriedade.
O seguinte cria uma instância da Person
classe e obtém o valor da age
propriedade por meio da instância:
john = Person('John', 25)
print(john.age)
Linguagem de código: Python ( python )
Saída:
25
Linguagem de código: Python ( python )
Além disso, você pode chamar o get_age()
método do Person
objeto diretamente assim:
print(john.get_age())
Linguagem de código: Python ( python )
Portanto, para obter o valor age
de um Person
objeto, você pode usar a age
propriedade ou o get_age()
método. Isso cria uma redundância desnecessária.
Para evitar essa redundância, você pode renomear o get_age()
método para o age()
método assim:
class Person:
def __init__(self, name, age):
self.name = name
self._age = age
def age(self):
return self._age
age = property(fget=age)
Linguagem de código: Python ( python )
O property()
aceita um callable (idade) e retorna um callable. Portanto, é um decorador. Portanto, você pode usar o @property
decorador para decorar o age()
método da seguinte forma:
class Person:
def __init__(self, name, age):
self.name = name
self._age = age
@property
def age(self):
return self._age
Linguagem de código: Python ( python )
Portanto, usando o @property
decorador, você pode simplificar a definição da propriedade de uma classe.
Decoradores setter
O seguinte adiciona um método setter ( set_age
) para atribuir um valor a _age
ser atribuído à Person
classe:
class Person:
def __init__(self, name, age):
self.name = name
self._age = age
@property
def age(self):
return self._age
def set_age(self, value):
if value <= 0:
raise ValueError('The age must be positive')
self._age = value
Linguagem de código: Python ( python )
Para atribuir set_age
ao objeto fset
de age
propriedade, você chama o setter()
método do age
objeto de propriedade da seguinte forma:
class Person:
def __init__(self, name, age):
self.name = name
self._age = age
@property
def age(self):
return self._age
def set_age(self, value):
if value <= 0:
raise ValueError('The age must be positive')
self._age = value
age = age.setter(set_age)
Linguagem de código: Python ( python )
O setter()
método aceita um chamável e retorna outro chamável (um property
objeto). Portanto, você pode usar o decorador @age.setter
para o set_age()
método assim:
class Person:
def __init__(self, name, age):
self.name = name
self._age = age
@property
def age(self):
return self._age
@age.setter
def set_age(self, value):
if value <= 0:
raise ValueError('The age must be positive')
self._age = value
Linguagem de código: Python ( python )
Agora você pode alterar o set_age()
método para o age()
método e usar a age
propriedade no __init__()
método:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if value <= 0:
raise ValueError('The age must be positive')
self._age = value
Linguagem de código: Python ( python )
Para resumir, você pode usar decoradores para criar uma propriedade usando o seguinte padrão:
class MyClass:
def __init__(self, attr):
self.prop = attr
@property
def prop(self):
return self.__attr
@prop.setter
def prop(self, value):
self.__attr = value
Linguagem de código: Python ( python )
Neste padrão, the __attr
é o atributo privado e prop
é o nome da propriedade.
O exemplo a seguir usa os @property
decoradores para criar as propriedades name
e age
na Person
classe:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if value <= 0:
raise ValueError('The age must be positive')
self._age = value
@property
def name(self):
return self._name
@name.setter
def name(self, value):
if value.strip() == '':
raise ValueError('The name cannot be empty')
self._name = value
Linguagem de código: Python ( python )
Resumo
- Use o
@property
decorador para criar uma propriedade para uma classe.