Objetos
Classes e objetos
Podemos pensar uma classe como o “tipo de algo” e a instância como uma “subcategoria desse tipo”. Por exemplo, país pode ser considerado um tipo de classe, e o Brasil seria uma instância dessa classe.
-
Para prepararmos um bolo, a classe seria a receita, e o objeto seria o bolo em si.
-
Na construção de uma casa, a planta da casa seria classe, e a casa em si, objeto
-
self
Declaração de uma classe
class Pais:
# atributos e métodos da classe
- A palavra reservada
classaponta a criação de uma classe em Python; - Após a palavra
class, indicamos o nome desejado para a classe. Por convenção, o nome da classe deve ser iniciado com letra maiúscula. Caso o nome da classe seja constituído por mais de uma palavra, a letra inical de cada palavra deve ser maiúscula. Ex.:PaisesAfrica
Construtor da classe (instanciar objeto)
Quando criamos algo baseado nos parâmetros definidos em uma classe, dizemos que estamos instanciando um objeto.
Uma classe pode ser entendida como um molde ou um modelo para a criação de um novo tipo de objeto. Ela permite que novas instâncias deste objeto sejam produzidas. Cada objeto instanciado pode ter atributos e métodos.
Uma classe é composta por atributos e métodos.
- Atributos são variáveis internas que definem as características do objeto criado. Os atributos devem ser referenciados no construtor da classe.
- Métodos são funções internas que modificam o estado do objeto. Fornecem funcionalidades a determinado objeto
Para declarar um atributo em uma classe, é necessário utilizar o método especial __init__() e a palavra reservada self.
-
__init__(): método responsável por iniciar um objeto. Seu primeiro parâmetro é a própria instância do objeto, que por convenção é chamado deself -
A título de curiosidade, o método
__new__()é o responsável por construir a classe. -
Para manipularmos o objeto criado e acessarmos seus atributos, utilizamos o operador
.. Por exemplo,conta.titular -
Objetos são acessados por referência. Quando criamos uma variável para associar a um objeto, essa variável não guarda o objeto, mas sim apenas uma maneira de acessá-lo. Não é correto dizer que a variável é o objeto, pois ela apenas faz uma referência ao objeto que será criado.
-
CONTINUANDO COM ATRIBUTOS - Agregação/Associação
-
Composição
- Quando a existência de uma classe depende de uma outra classe
-
Modificadores de acesso (Encapsulamento)
class Pais: # definição do modelo
def __init__(self, nome, continente, capital, idioma): # função construtora da classe. Responsável por definir as características do tipo de dado (no nosso caso, `Pais`)
self.nome = nome
self.continente = continente
self.capital = capital
self.idioma = idioma
def localizacao(self): # criação de um método. Define determinado comportamento ou ação que um objeto pode realizar
if self.continente:
print(f'{self.nome} está localizado no {self.continente}')
else:
print('Continente não indicado')
def __str__(self):
return f'{self.nome} está localizado no continente {self.continente} e tem como capital {self.capital}. O idioma oficial é o {self.idioma}.'
def main(): #
paises = Pais('Africa do Sul', 'África', 'Joanesburgo', 'Inglês') # criação de um objeto do tipo país que possui os atributos nome, continente, capital e idioma
print(paises)
print(f'{paises.nome}, {paises.continente}, {paises.capital}, {paises.idioma}')
lugar = paises.localizacao()
if __name__ == "__main__":
main()
Encapsulamento
Encapsulamento diz respeito à proteção do acesso de algumas informações presentes em determinada classe
- Em Python, o encapsulamento é realizado a partir de uma convenção a qual indica que métodos que começam com um underscores
_não devem (mas podem) ser acessados fora da classe get: recupera dadosset: altera dados
| Encapsulamento | Descrição |
|---|---|
self.atributo - público | Pode ser acessada por qualquer lugar |
self.__atributo - privado | Atributo/Método não deve ser acessado fora da classe |
self._atributo - protegido | Atributo/Método é público mas não deve ser acessado |
@property | Atributo/Método está restrito, sendo assim, o acesso às variáveis funciona apenas dentro da classe |
Tipos de métodos
-
@classmethod: Método de classe, utiliza por convenção oclscomo parâmetro de funções -
@staticmethod: Métodos estáticos, não recebem as convençõesclseselfcomo parâmetros da função. Não interage com os atributos. -
@abstractclassmethod: Métodos abstratos, servem para proteger os métodos herdados que precisam ser modificados -
Métodos de instância não utilizam decoradores; recebem como parâmetro o
self
Herança e polimorfismo
Herança
A herança é um princípio que permite criar uma nova classe (chamada de classe filha) a partir de uma classe já existente (chamada de classe mãe ou superclasse). Utilizamos as classes para reaproveitar códigos, já que a classe filha herda automaticamente todos os atributos e métodos da classe mãe, além de poder adicionar novas características exclusivas.
Polimorfismo
Esta palavra significa “muitas formas”. Na programação, ele ocorre quando modificamos os métodos herdados da classe mãe. Ou seja, utilizamos o mesmo nome de método, mas alteramos o seu comportamento interno para atender às necessidades específicas da nova classe. Assim, um mesmo comando pode gerar ações diferentes dependendo do objeto que o executa.
Diferença entre self e cls:
-
self: Faz referência à instância (o objeto gerado). É utilizado sempre que queremos acessar, criar ou modificar atributos que pertencem àquele objeto em específico. -
cls: Faz referência à própria classe. É utilizado (junto aos métodos de classe) sempre que precisamos manipular dados que pertencem ao “molde” geral, afetando a classe como um todo, independentemente dos objetos que já foram instanciados.
Herança múltipla e interfaces
A herança múltipla ocorre quando uma classe filha recebe atributos e métodos de duas ou mais classes base (superclasses) simultaneamente. A linguagem Python suporta essa funcionalidade de forma nativa, permitindo a combinação de comportamentos de origens distintas.
A declaração é feita passando as classes base separadas por vírgula. Exemplo: class ClasseFilha(Mae1, Mae2):.
MRO (Method Resolution Order - Ordem de Resolução de Métodos): Caso as classes base possuam métodos com o exato mesmo nome, o Python utiliza uma regra de prioridade para decidir qual executar. Essa busca ocorre da esquerda para a direita, com base na ordem em que as classes foram inseridas entre os parênteses.