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”