Getters: métodos usados em Programação Orientada a Objetos (POO) para acessar atributos privados de uma classe.
Setters: métodos usados em POO para definir o valor de atributos privados de uma classe.
Atributo privado - encapsulamento
Se você não está familiarizado com atributos privados ou métodos privados em Python, leia este artigo da DataCamp.
Vamos ver como implementar um atributo privado em Python.
classSampleClass:def__init__(self, a):## private varibale or property in Python
self.__a = a
## getter method to get the properties using an objectdefget_a(self):return self.__a
## setter method to change the value 'a' using an objectdefset_a(self, a):
self.__a = a
Tecnologia
SampleClass tem três métodos.
__init__: usado para inicializar os atributos ou propriedades de uma classe.
__a: é um atributo privado.
get_a: usado para obter o valor do atributo privado a.
set_a: usado para definir o valor de a por meio de um objeto da classe.
Você não consegue acessar variáveis privadas diretamente em Python. Por isso implementamos o método getter.
Veja como a classe funciona.
## creating an object
obj = SampleClass(10)## getting the value of 'a' using get_a() methodprint(obj.get_a())## setting a new value to the 'a' using set_a() method
obj.set_a(45)print(obj.get_a())Tecnologia
É assim que você implementa atributos privados, getters e setters em Python. O mesmo processo é usado em Java. Agora, vamos escrever a mesma ideia de um jeito mais pythônico.
classPythonicWay:def__init__(self, a):
self.a = a
Tecnologia
Você não precisa de getters e setters para acessar ou alterar atributos. Dá para acessar diretamente pelo nome do atributo.
Veja só.
## Creating an object for the 'PythonicWay' class
obj = PythonicWay(100)print(obj.a)Tecnologia
SampleClass esconde atributos e métodos privados. Ela implementa o recurso de encapsulamento da POO.
PythonicWay não esconde os dados. Ela não implementa encapsulamento.
Qual é a melhor para usar?
Depende da sua necessidade. Se você quer atributos e métodos privados, pode implementar a classe usando métodos setters e getters; caso contrário, use a forma direta.
Property
E se você quiser impor condições ao definir o valor de um atributo na SampleClass?
Por exemplo: se o valor passado for par e positivo, definimos no atributo; caso contrário, definimos 2.
Vamos implementar isso alterando o método set_a() em SampleClass.
classSampleClass1:def__init__(self, a):## calling the set_a() method to set the value 'a' by checking certain conditions
self.set_a(a)## getter method to get the properties using an objectdefget_a(self):return self.__a
## setter method to change the value 'a' using an objectdefset_a(self, a):## condition to check whether 'a' is suitable or notif a >0and a %2==0:
self.__a = a
else:
self.__a =2Tecnologia
Vamos testar a classe criando um objeto.
## creating an object for the class 'SampleClass1'
obj = SampleClass1(16)print(obj.get_a())Tecnologia
Agora, veja como implementar a classe acima usando o decorador @property.
classProperty:def__init__(self, var):## initializing the attribute
self.a = var
@propertydefa(self):return self.__a
## the attribute name and the method name must be same which is used to set the value for the attribute@a.setterdefa(self, var):if var >0and var %2==0:
self.__a = var
else:
self.__a =2Tecnologia
@property é usado para obter o valor de um atributo privado sem precisar de métodos getter. Basta colocar @property acima do método que retorna a variável privada.
Para definir o valor da variável privada, usamos @method_name.setter acima do método que atuará como setter.
Vamos testar a classe Property para ver se os decorators estão funcionando corretamente.
## creating an object for the class 'Property'
obj = Property(23)print(obj.a)Tecnologia
O @a.setter define o valor de a verificando as condições que especificamos no método. Outra forma de usar property é...
classAnotherWay:def__init__(self, var):## calling the set_a() method to set the value 'a' by checking certain conditions
self.set_a(var)## getter method to get the properties using an objectdefget_a(self):return self.__a
## setter method to change the value 'a' using an objectdefset_a(self, var):## condition to check whether var is suitable or notif var >0and var %2==0:
self.__a = var
else:
self.__a =2
a =property(get_a, set_a)Tecnologia
Passe os métodos getter e setter para property e atribua ao nome que você quer usar como atributo da classe.
## creating an object for the 'AnotherWay' class
obj = AnotherWay(28)print(obj.a)Tecnologia
Deixe os métodos setter e getter privados para escondê-los. Vamos fazer isso.
classFinalClass:def__init__(self, var):## calling the set_a() method to set the value 'a' by checking certain conditions
self.__set_a(var)## getter method to get the properties using an objectdef__get_a(self):return self.__a
## setter method to change the value 'a' using an objectdef__set_a(self, var):## condition to check whether var is suitable or notif var >0and var %2==0:
self.__a = var
else:
self.__a =2
a =property(__get_a, __set_a)Tecnologia
Vamos conferir se está funcionando direitinho.
## creating an object for the 'AnotherWay' class
obj = FinalClass(12)print(obj.a)Tecnologia
Neste tutorial, você aprenderá tudo sobre as cadeias de caracteres do Python: fatiamento e encadeamento, manipulação e formatação com a classe Formatter, cadeias de caracteres f, modelos e muito mais!
O que são getters e setters?
Atributo privado - encapsulamento
Se você não está familiarizado com atributos privados ou métodos privados em Python, leia este artigo da DataCamp.
Vamos ver como implementar um atributo privado em Python.
SampleClass tem três métodos.
__init__: usado para inicializar os atributos ou propriedades de uma classe.
Você não consegue acessar variáveis privadas diretamente em Python. Por isso implementamos o método getter.
Veja como a classe funciona.
É assim que você implementa atributos privados, getters e setters em Python. O mesmo processo é usado em Java. Agora, vamos escrever a mesma ideia de um jeito mais pythônico.
Você não precisa de getters e setters para acessar ou alterar atributos. Dá para acessar diretamente pelo nome do atributo.
Veja só.
Qual é a diferença entre as duas classes acima?
Qual é a melhor para usar?
Property
E se você quiser impor condições ao definir o valor de um atributo na SampleClass?
Por exemplo: se o valor passado for par e positivo, definimos no atributo; caso contrário, definimos 2.
Vamos implementar isso alterando o método set_a() em SampleClass.
Vamos testar a classe criando um objeto.
Agora, veja como implementar a classe acima usando o decorador @property.
@property é usado para obter o valor de um atributo privado sem precisar de métodos getter. Basta colocar @property acima do método que retorna a variável privada.
Para definir o valor da variável privada, usamos @method_name.setter acima do método que atuará como setter.
Vamos testar a classe Property para ver se os decorators estão funcionando corretamente.
O @a.setter define o valor de a verificando as condições que especificamos no método. Outra forma de usar property é...
Passe os métodos getter e setter para property e atribua ao nome que você quer usar como atributo da classe.
Deixe os métodos setter e getter privados para escondê-los. Vamos fazer isso.
Vamos conferir se está funcionando direitinho.
Conclusão
Agora você viu como implementar encapsulamento em Python e a diferença entre setter, getter e property.
Se você está começando em Python, recomendo o curso gratuito da DataCamp Introduction to Python.
Ficou com alguma dúvida sobre o artigo? Deixe seu comentário. Bons códigos!