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

Orientação abjetos de Outra Forma: Abc.

Na Despousão Sobre Herança E Mixins Foram Criadas Várias Classes, Como AuteNticavel E AutteNiCavelcom … Tagged с Оопом, Питоном, Бразильидавым.

Orientação objetos de Outra Forma (6 целых серий)

Na Despousão Sobre Herança e Mixins WHAM Criadas Várias Classes, Como Autenticavel е Autenticavelcomregistro que adicionam funcolionidades autorrass классов e AdvanceAvam Tudo O Que Precisavam Para SEU Funcionamento. Entretanto Podem Ductir Casos Em Que Não Seja Possível Affectar Todas As Funções Na Prória Classe, deixando Com que aks que a stestende реализует Essas Funções. UMA Forma de Fazer Isso Eravés Das ABC ( Абстрактные базовые классы , OU классы базы Abstratas).

SEM USO de Classes Base Abstratas

UM Exemplo de classe que não ésíval Осуществляет Todas как Funcallidades Foi Dada No Texto Encapsulamento da lógica do Algoritmo que discutia a Leitura de Valores do Teclado até que um Valor válido fosse lido (ou que repete a leitura caso um valor inválido tivesse sido informado). Nesse Caso Classe Validainput AdvolationaVa A a Lógica Base de Funcionamento, Porém Eram SuAs Classes Filhas ( ValidanomeInput e Validanotainput ) que Axampleavam o Funções Para Tratar O Que Foi Lido Do Teclado E Verificar Se éum Valor Válido Ou Não.

class ValidaInput:
    mensagem_valor_invalido = 'Valor inválido!'

    def ler_entrada(self, prompt):
        return input(prompt)

    def transformar_entrada(self, entrada):
        raise NotImplementedError

    def validar_valor(self, valor):
        raise NotImplementedError

    def __call__(self, prompt):
        while True:
            try:
                valor = self.transformar_entrada(self.ler_entrada(prompt))
                if self.validar_valor(valor):
                    break
            except ValueError:
                ...
            print(self.mensagem_valor_invalido)
        return valor


class ValidaNomeInput(ValidaInput):
    mensagem_valor_invalido = 'Nome inválido!'

    def transformar_entrada(self, entrada):
        return entrada.strip().title()

    def validar_valor(self, valor):
        return valor != ''


class ValidaNotaInput(ValidaInput):
    mensagem_valor_invalido = 'Nota inválida!'

    def transformar_entrada(self, entrada):
        return float(entrada)

    def validar_valor(self, valor):
        return 0 <= valor <= 10

Entretanto, Esse Código Убедитесь, что Criação de objetos da classe Validainput Mesmo Sem Ter UMA AxampleAção Das Funções Transformar_entrada е validar_valor Отказ E A A única Mensagem de erro Ocorereria Ao Tentar Executar Essas Funções, o que Poderia Estar Longe Do Procementa Real, que é criação dum objeto Partir de UMMA Classe que não доказать Тодас как реализация, как реализуетções das suas funções, o que seria semelhante CLASSE ABTERATA EM OUTRARS LINGAGENS.

obj = ValidaInput()

# Diversas linhas de código

obj('Entrada: ')  # Exceção NotImplementedError lançada

COM USO de Classes Base Abstratas

Seguindo Documentação da ABC Para Utilizá-Las é Nebrio Infornar Metaclasse Abcmeta Na Criação Da Classe, OU Simplemente Estender Classe ABC , Е декорар COM абстрактный Как Funções que que как классы que enstenderem deverão Exemplo:

from abc import ABC, abstractmethod


class ValidaInput(ABC):
    mensagem_valor_invalido = 'Valor inválido!'

    def ler_entrada(self, prompt):
        return input(prompt)

    @abstractmethod
    def transformar_entrada(self, entrada):
        ...

    @abstractmethod
    def validar_valor(self, valor):
        ...

    def __call__(self, prompt):
        while True:
            try:
                valor = self.transformar_entrada(self.ler_entrada(prompt))
                if self.validar_valor(valor):
                    break
            except ValueError:
                ...
            print(self.mensagem_valor_invalido)
        return valor

DESTA FORMA, оккуррера UM ERRO JA AO AO TENTAR CRAR IM OBJETO DO TIPO Validainput Dizendo Quais São как Funções que Precisam Ser Adverysadas. Porém Funciapará Normormente Ao Cril Objetos классы Partir DAS ValidanomeInput е Validanotainput Visto Que Elas Arelseam Essas Funções.

obj = ValidaInput()  # Exceção TypeError lançada

nome_input = ValidaNomeInput()  # Objeto criado
nota_input = ValidaNotaInput()  # Objeto criado

COMO ESSAS FUNCHõES NãO UTILIZAM A RELECTINCIA AO OBJETO ( SELL ), AINDA É TOSSíLEVE RECHERAR как Funções COM StaticMethod , COMO:

from abc import ABC, abstractmethod


class ValidaInput(ABC):
    mensagem_valor_invalido = 'Valor inválido!'

    @staticmethod
    def ler_entrada(prompt):
        return input(prompt)

    @staticmethod
    @abstractmethod
    def transformar_entrada(entrada):
        ...

    @staticmethod
    @abstractmethod
    def validar_valor(valor):
        ...

    def __call__(self, prompt):
        while True:
            try:
                valor = self.transformar_entrada(self.ler_entrada(prompt))
                if self.validar_valor(valor):
                    break
            except ValueError:
                ...
            print(self.mensagem_valor_invalido)
        return valor


class ValidaNomeInput(ValidaInput):
    mensagem_valor_invalido = 'Nome inválido!'

    @staticmethod
    def transformar_entrada(entrada):
        return entrada.strip().title()

    @staticmethod
    def validar_valor(valor):
        return valor != ''


class ValidaNotaInput(ValidaInput):
    mensagem_valor_invalido = 'Nota inválida!'

    @staticmethod
    def transformar_entrada(entrada):
        return float(entrada)

    @staticmethod
    def validar_valor(valor):
        return 0 <= valor <= 10

Isso Também Seria Válido Para Funções Decoradas Com ClassMethod , que thingberiam a Relectioncia Classe ( CLS ).

Рассматривать

NãO EPARIOIO UTILIZAR ABC PARA Fazer O Exemplo Discutido, Porém Ao Utilizar Essa Biblioteca Ficou Mais Excensecito Quais As Funções que Precisavam Ser Axampledos NAS Classes Filhas, Ainda Mais Que Sem Utilizar ABC Classe Base Poderia Nem Ter As Funções, COM:

class ValidaInput:
    mensagem_valor_invalido = 'Valor inválido!'

    def ler_entrada(self, prompt):
        return input(prompt)

    def __call__(self, prompt):
        while True:
            try:
                valor = self.transformar_entrada(self.ler_entrada(prompt))
                if self.validar_valor(valor):
                    break
            except ValueError:
                ...
            print(self.mensagem_valor_invalido)
        return valor

COMO Python Ossui Утка, набрав NãO EPARIO UMA Grande Precupação Com OS Tipos, COMO DEAPIR E UTILIZAR Интерфейсы представляют EM OTILIZAR ResplareAções de orientação objetos, porém devido à herança múltipla, abc pode ser utilizada como интерфейс que não existe EM Python, Fazendo Com que que в качестве классов реализует детерминию Funções. Para mais a repeito desse assunto, recomendo как duas живет de dunossauro sobre abc ( 1 e 2 ), E A Ameresentação do Luciano Ramalho Sobre Тип подсказки Отказ

UMA Classe Filha Também Não É Obrigada Осуществляется Todas As Funções Decoradas Com Абсормета , MAS Assim Como Classe Pai, Não Serás Assíval Classe Classe Partir Dessa, Apenas de Uma Classe Filha Dela Que реализует как Demais Funções. COMO SE AO Applear UM Абсормета Tornasse Classe Abrata, e Quequer Classe Filha Só Deixasse de Ser abstrata Quando A última Função Decorada Com Абсормета Для Собрита. Exemplo:

from abc import ABC, abstractmethod


class A(ABC):
    @abstractmethod
    def func1(self):
        ...

    @abstractmethod
    def func2(self):
        ...


class B(A):
    def func1(self):
        print('1')


class C(B):
    def func2(self):
        print('2')


a = A()  # Erro por não implementar func1 e func2
b = B()  # Erro por não implementar func2
c = C()  # Objeto criado

Orientação objetos de Outra Forma (6 целых серий)

Оригинал: “https://dev.to/acaverna/orientacao-a-objetos-de-outra-forma-abc-89b”