Decorador de propriedades Python

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 propertyclasse:

class property(fget=None, fset=None, fdel=None, doc=None)Linguagem de código:  Python  ( python )

O seguinte define uma Personclasse com dois atributos namee age:

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

Para definir um getter para o ageatributo, você usa a propertyclasse 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 propertyaceita um getter e retorna um objeto de propriedade.

O seguinte cria uma instância da Personclasse e obtém o valor da agepropriedade por meio da instância:

john = Person('John', 25)
print(john.age)Linguagem de código:  Python  ( python )

Saída:

25Linguagem de código:  Python  ( python )

Além disso, você pode chamar o get_age()método do Personobjeto diretamente assim:

print(john.get_age())Linguagem de código:  Python  ( python )

Portanto, para obter o valor agede um Personobjeto, você pode usar a agepropriedade 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 @propertydecorador 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 @propertydecorador, 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 _ageser atribuído à Personclasse:

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

Para atribuir set_ageao objeto fsetde agepropriedade, você chama o setter()método do ageobjeto 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 propertyobjeto). Portanto, você pode usar o decorador @age.setterpara 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 = valueLinguagem de código:  Python  ( python )

Agora você pode alterar o set_age()método para o age()método e usar a agepropriedade 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 = valueLinguagem 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 = valueLinguagem 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 @propertydecoradores para criar as propriedades namee agena Personclasse:

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

Resumo

  • Use o @propertydecorador para criar uma propriedade para uma classe.

Deixe um comentário

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