Programação Orientada à Objetos (POO) em Python

Classes

Para criar uma classe:

# define que é uma classe e o nome dela
class Nome_Classe:

# construtor da classe
def __init__(self, parametro1, parametro2):
self.atributo1 = ‘X’
self.atributo2 = 10
self.atributo3 = parametro1
self.atributo4 = parametro2
self.atributo5 = self.calcula_atributo5()

def calcula_atributo5(self):
return 1 + 2

Caso você não esteja familiarizado com o termo, um construtor é um método que é executado sempre que um novo objeto daquela classe é criado. Além de servir para inicializar os atributos, ele também é usado para garantir que determinados parâmetros obrigatórios sejam necessariamente informados para que a classe seja criada.

Note que nos dois métodos, o primeiro argumento é o self. Ele é um parâmetro obrigatório em todos os métodos das classes que é utilizado para acessar atributos e métodos da instância da própria classe.


Para instanciar uma classe:

nome_classe = Nome_Classe(parametro1, parametro2)
print(nome_classe.atributo1) # é possível acessar diretamente os atributos
nome_classe.atributo2 = 20 # também é possível alterar os valores, o que nem sempre é bom


Variáveis que representam objetos armazenam a referência daquele objeto. Isso significa que se você passar o valor de uma variável para outra, as duas irão representar o mesmo objeto:

variavel1 = Objeto()
variavel1.nome = ‘Ana’
variavel2 = variavel1
variavel2.nome = ‘Bruna’
print(variavel1.nome) # ‘Bruna
print(variavel2.nome) # ‘Bruna


Outra forma de ver isso é quando passamos parâmetros com valores simples (como números) e quando passamos referências à objetos.

Exemplo:

def muda_saldo(saldo):
saldo += 10

def muda_saldo2(obj):
obj.saldo += 10

obj1 = Objeto()
obj1.saldo = 100

muda_saldo(obj1.saldo) # passa uma cópia do valor da variável saldo
print(obj1.saldo) # irá exibir 100

muda_saldo2(obj1) # passa a referência do objeto
print(obj1.saldo) # irá exibir 110


Herança

A herança consiste em definir que uma classe herda os atributos e métodos de outra classe. Isso é útil quando temos classes com comportamentos similares, mas algumas diferenças.

Por exemplo, tanto um vendedor quanto um gerente são funcionários de uma empresa. Portanto, ambos têm características em comum, como nome, documento de identificação, matrícula na empresa, etc. Por outro lado, o cálculo de participação nos lucros, por exemplo, é diferente. Para esse tipo de situação, podemos criar uma classe Funcionário, que irá conter os atributos e métodos que qualquer funcionário deve possuir, e, para cada cargo específico, criamos uma classe com suas respectivas peculiaridades.

Para definir que uma classe herda de outra:

class Gerente(Funcionario):


Podemos chamar o construtor da classe mãe no construtor da classe filha:

class Mae():
def __init__(self, name):
self.name = name

class Filha(Mae):
def __init__(self, name):
super().__init__(name) 


Os atributos e métodos definidos na classe mãe podem ser acessados nas classes filhas usando o operador self. Quando um método existe em ambas as classes, podemos especificar que queremos usar o método da classe mãe usando o operador super().

Exemplo:

class X():    
    def __init__(self, salario):
        self.salario = salario
        
    def get_salario(self):
        return self.salario
    
    def calcula(self):
        return self.salario * 0.15
        
class Y(X):    
    def __init(self, salario):
        super().__init__(salario)
    
    def calcula(self):
        return super.calcula() #Está retornando o método calcula da classe X usando o operador super()
        
    def calcula_especifico(self):
        return self.get_salario() * 0.1 #Está acessando o atributo da classe mãe usando o operador self


Comentários

Postagens mais visitadas deste blog

Como criar um jogo usando Python

Biblioteca Python: Random