Рубрики
Без рубрики

Orientação a objetos de autra forma: herança múltiplas e Mixins

Нет Texto Offer Foi Apresentando o Canceito de Herança, Que Herda Toda A Estrutura E Comportamento … Tagged с OOP, Python, Braziliandevs.

Нет Texto Передний Foi Apresentando o canceito de gerança, Que Herda toda a Estrutura e Comportamento de Uma Classe, Podendo Estendê-la com wutros atributos e Comportamentomeos. Esse Texto Apresentará a Ideia de Геранса Мультипла , E UMA Forma Para Se Aproveitar Esse Recurco, Através de Mixins.

Геранса Мултиплас

Voltando ao sistema para lidar com dados das pessoas, onde algumas dessas pesoas oversuem ancibilidade de acessar o sistema através de usuário e senha, também deseja-se реглас Quesemas autentiquem e tenham acesso obravé-semas sistemas outentiquem e tenham oseja-ses API Анкет Isso Pode Ser Feito Criando Uma Classe Para Para Представление OS Sistemas Que Terão Permissão Para Acessar Os Dados. Пример:

class Sistema:
    def __init__(self, usuario, senha):
        self.usuario = usuario
        self.senha = senha

    def autenticar(self, usuario, senha):
        return self.usuario == usuario and self.senha == senha

Porém, Esse Código Repete a Infulação feita para Pessoaautenticavel :

class PessoaAutenticavel(Pessoa):
    def __init__(self, nome, sobrenome, idade, usuario, senha):
        super().__init__(nome, sobrenome, idade)
        self.usuario = usuario
        self.senha = senha

    def autenticar(self, usuario, senha):
        return self.usuario == usuario and self.senha == senha

AppoveItando Que Python, Diferente de Outras linguagens, возможно, классы Herança múltipla, Essível Essa Lógica Das, Centralizando a Infulação em Uma umpair classe e simplesmente hardá-la. Пример:

class Autenticavel:
    def __init__(self, *args, usuario, senha, **kwargs):
        super().__init__(*args, **kwargs)
        self.usuario = usuario
        self.senha = senha

    def autenticar(self, usuario, senha):
        return self.usuario == usuario and self.senha == senha


class PessoaAutenticavel(Autenticavel, Pessoa):
    ...


class Sistema(Autenticavel):
    ...


p = PessoaAutenticavel(nome='João', sobrenome='da Silva', idade=20,
                       usuario='joao', senha='secreta')

Primeira Coisa A Ser Obsersada São Os Argemoros *args E ** Kwargs Нет __init__ да Классе Autenticavel , Eles são usados uma vez que não se sabe todos os asmeros que o __init__ Da Classe Que Estenderá O Autenticavel Espera eceber, Funcionando de forma dinâmica (Mais sobre esse recurco pode ser visto na documentação do python ).

Сегунда Coisa A Ser Verificada é Que Para A Classe Pessoaautenticavel , Agora cria em seus objetos, эстратура танто да Классе Пессоа , Quanto Autenticavel . Algo аналогично Aersão Sem Orientação a objetos a baixo:

# Arquivo: pessoa_autenticavel.py

import autenticavel
import pessoa


def init(p, nome, sobrenome, idade, usuario, senha):
    pessoa.init(p, nome, sobrenome, idade)
    autenticavel.init(p, usuario, senha)

Também Vale Obserar Que как классы Pessoaautenticavel е – Sistema Néa Precisam Definiir Nenhuma Funcáo, Uma Vez Que elas cumprem seus papéis apenas herdando ootras clesess, porém seria prostivel infular funcões explicíficas dessas, ассим Комо Собранквер в качестве уроков Depanidas Poras.

Ordem de Resolução de métodos

Embora Herança múltiplas sejam Interessantes, существует проблема, Se Ambas, как классы Pai Offuitrem Uma Funcáo Comm Mesmo Nome, Classe Filha Deveria Chamar Qual Das Funções? A Do Primeiro Pai? A Do último? Para LiDar Com Esse Проблема O Python USA O MRO ( Порядок разрешения метода , Ordem de Resolução do método), Que em em uma tupla com a ordem de Qual classe o Python usará para incontrar o método a ser wamado. Пример:

print(PessoaAutenticavel.__mro__)
# (, , , )

POR ESSE MOTIVO QUE TAMBEM FOI OFIVER THAMAR O Super () .__ init__ Dentro de Autenticavel , Que devido ao mro, o python chama o __init__ da autra classe pai da classe Que Que Estendeu Autenticavel , em Vez de precisar fazer um método __init__ Эм Pessoaautenticavel Чамандо О __init__ de todas в качестве классов Suas pais, como foi feito na versão sem Orientação abjetos. E por isso ordem Autenticavel E Пессоа на Herança de Pessoaautenticavel , para fazer o mro procurar OS Métodos Primeiro Em Autenticavel E Depois em Пессоа Анкет

Para tentar fugir da complexidade que pode ser gerança múltipla, é pusinevel escrever classe Que Tem por objetivo Unicamentie incluir alguma funcionalidade em utra, como o caso da classe Autenticavel , Que Pode Ser Herdada por Qualquer Outra classe do sistema para ormitir o acesso ao sistema. Классы Essas получают Nome de Mixins, E Adiciona Uma Funcionalidade Bem Depinade.

ESTENDENDO MICLESINS

Представьте себе, что Semem de ormitir o acesso ao sistema, Тамбем Гостариамос де регистратор Алгумас Тентативас де Акессо, Инфинадо Квандо Хоуве А. Комо Autenticavel é Uma Classe, é Officevel Extendê-La Para Infular essa funcionalidade na funcáo Autenticar . Пример:

from datetime import datetime


class AutenticavelComRegistro(Autenticavel):
    @staticmethod
    def _get_data():
        return datetime.now().strftime('%d/%m/%Y %T')

    def autenticar(self, usuario, senha):
        print(f'{self._get_data()} Tentativa de acesso de {usuario}')
        acesso = super().autenticar(usuario, senha)
        if acesso:
            acesso_str = 'permitido'
        else:
            acesso_str = 'negado'
        print(f'{self._get_data()} Acesso de {usuario} {acesso_str}')
        return acesso


class PessoaAutenticavelComRegistro(AutenticavelComRegistro, Pessoa):
    ...


class SistemaAutenticavelComRegistro(AutenticavelComRegistro, Sistema):
    ...


p = PessoaAutenticavelComRegistro(
    nome='João', sobrenome='da Silva', idade=20,
    usuario='joao', senha='secreta',
)
p.autenticar('joao', 'secreta')
# Saída na tela:
# 23/04/2021 16:56:58 Tentativa de acesso de joao
# 23/04/2021 16:56:58 Acesso de joao permitido

Essa infulação utiliza-se do Super () Para Acessar A Funcáo Autenticar да Классе Autenticavel para não preciSar Reimplementar Autenticação. Porém, Antes de Chamá-la, Manipula seus argiryos para Регистратор Quem Tentou Acessar O Sistema, Assim Como Também Manipula o Seu Retorno Para Registrar Se O Acesso foi ormitido ou não.

Essa Classe Também Permite Analisar melhor ordem em Que as Classes SãO ConsultAdas Quando Uma Funcáo é Chamada:

print(PessoaAutenticavelComRegistro.__mro__)
# (, , , , )

Que Também Pode Ser Visto Na Forma de UM Diagrama de Classes:

Onde é feito uma BUSCA EM PROFUNDIDADE , Como Se Funcão Fosse Chamada Нет Primeiro Pai, E S Se ela não для Encontrada, Busca-Se No Segundo Pai E Assim Por Diante. Тамбем é OpingVevel Obsersar A Classe объект , Que Semper Será a última classe, e a a classe pai de todas, как классы Outras, делают Python quando elas nion возможно, что явность.

Учитывайте

Herança múltipla Pode Dicoultar Bastante O Intendentimento do Código, Принцип Para Encontrar Onde Detrinada Funcáo está Definida, Porém Pode Faceilitar Bastante O Código. UM Exememplo Que USA Bastante Herança e Mixins Sao As Просмотры Baseadas em classe do django ( на основе классов ), Porém para farsilitar A Visualização Essave O Site Классные классовые представления Que Lista Todas в качестве классов, E OS Mixins utilizados em Cada Uma, Como Pode Ser Visto Em “предки” Como na UpdateView , que é usado para criar uma página com formulário para editar um registro já extainte no banco, Assim ela USA Mixins para pegar um objeto do banco ( mountobjectmixin ), процесс Formulário baseado em uma tabela do banco ( modelformmixin ) elgumas utwras funcionalidades reeection para para essa página.

Оригинал: “https://dev.to/acaverna/orientacao-a-objetos-de-outra-forma-heranca-multiplas-e-mixins-31eb”