Orientação a Objetos em Python

Quando começamos a programar em qualquer linguagem de programação, temos que seguir um padrão de escrita de código, essa forma de construir nosso algoritmo é chamado de paradigma.

Existem diversos paradigmas de programação: Estrutural, Procedural, Imperativo, Declarativo, Funcional e Orientado a Objetos. Este último é o que abordaremos neste artigo.

O que é?

A Programação Orientada a Objetos foi conceituada por Alan Kay, que se baseou em conceitos de biologia e matemática, pois fazia parte da formação do Alan. Além de idealizar esta a POO, ele criou a primeira linguagem que implementava a Orientação a Objetos, a linguagem Smalltalk.

A ideia de Kay é trazer para a computação o mundo real, físico, partindo do pressuposto de que tudo no mundo real é um objeto, que interage com outros objetos, e estes podem ser classificados.

Definição

Como tudo em nosso mundo, os objetos precisam ser criados a partir de algo, uma fôrma, uma classe.

Os objetos em nosso mundo possuem características individuais, uma pessoa é identificada por um CPF, RG e nome, estes são seus atributos. Mas estes podem também ter comportamentos, ações, como um controle de TV, que liga, desliga a TV, muda de canal, altera o volume, uma forma, um método deste objeto interagir.

Com isto em mente, já temos os alicerces da OO: Classes, Objetos, Atributos e Métodos. Mas estes conceitos são para construir formar a ideia de POO, mas para considerar que uma linguagem é OO devem ser levados em consideração os pilares deste paradigma: Abstração, Herança, Encapsulamento e Polimorfismo.

Implementação

Uma classe Pessoa em Python:

class Person:
	def __init__(self, first_name, last_name, document):
		self.first_name = first_name
		self.last_name = last_name
		self.document = document

	def full_name(self):
		return f'{self.first_name} {self.last_name}'

Uma vantagem no Python é sua sintaxe muito parecida com a humana, logo, usamos a palavra-chave class e o nome que queremos dar a nossa classe. Em seguida, definimos o método inicializador (também chamado de construtor, em outras linguagens) que é executado assim que criamos um objeto da classe Pessoa, que recebe os atributos que são atribuídos à instância de Pessoa, por meio do parâmetro self. Também definimos um método full_name para retorna o nome completo de uma Pessoa.

class Worker(Person):
	def __init__(self, work):
		Person().__init__(self)
		self.work = work

robert = Person('Robert', 'Perteson', '65778901934')
bill = Worker('Bill', 'Gates', '23490856721', 'Ex Microsoft CEO')

people = (robert, bill)

for person in people:
	print(person.full_name())

Temos agora uma classe Trabalhador que herda os mesmos atributos e método de Pessoa, apenas com um novo atributo que é seu ‘trabalho’. Instanciamos ao final dois objetos de cada classe em uma tupla, e iteramos sobre a mesma. Note que acessamos cada valor da tupla e executamos um método que é comum as estes objetos, independente da forma da classe, tendo este método, será executado, isto é polimofismo.

O encapsulamento é basicamente se um dado, seja atributo ou método, deve ser escondido de quem utilizará tal classe. Um dado pode ter um de três modos de acesso: público, privado e protegido. Voltemos a nossa classe Pessoa e Work.

class Person:
	def __init__(self, first_name, last_name, document):
		self.first_name = first_name
		self.last_name = last_name
		self._document = document

	def full_name(self):
		return f'{self.first_name} {self.last_name}'

class Worker(Person):
	def __init__(self, work, salary):
		Person().__init__(self)
		self.work = work
		self.__salary = salary

Em Python, usamos uma convenção (um padrão na comunidade e linguagem) que todo método ou atributo com um ‘_’ (underscore) é protegido, com 2 ‘_’ é privado, quando não possui, então é público. Em Pessoa, o ‘documento’ é protegido, acessado apenas pela classe e quem herda ela. Mas o ‘salário’ é acessível apenas pela classe/objeto Trabalhador, logo, privado.

Conclusão

A essência do Python é a Orientação a Objetos, e de longe, é uma das linguagem que implementa de forma mais fácil e compreensível, outra muito legal que também é OO é Ruby, que recomendo dar uma pesquisada. Por fim, espero ter esclarecido este assunto de POO com Python. Até a próxima.

Referências

POO: tudo sobre Programação Orientada a Objetos!

Encapsulation in Python – GeeksforGeeks

Polymorphism in Python – GeeksforGeeks

Inheritance in Python – GeeksforGeeks