Una clase abstracta es una clase, pero no una desde la que pueda crear objetos directamente. Su propósito es definir cómo deben verse otras clases, es decir, qué métodos y propiedades se espera que tengan.
Los métodos y propiedades definidos (pero no implementados) en una clase abstracta se denominan métodos abstractos y propiedades abstractas . Todos los métodos y propiedades abstractos deben implementarse en una clase secundaria para poder crear objetos a partir de ella.
Podemos crear una clase abstracta heredándola de la ABCclase que forma parte del abcmódulo .
from abc import (
ABC,
abstractmethod,
)
class BasicPokemon(ABC):
def __init__(self, name):
self.name = name
self._level = 1
@abstractmethod
def main_attack(self):
...
¿Qué sucede si intenta crear un objeto BasicPokemondirectamente? TypeError!
Ahora, notará que BasicPokemonel __init__método espera un nameargumento, por lo tanto, el código anterior no habrá funcionado de todos modos. Lo que hay que tener en cuenta aquí es que ni siquiera va al __init__método para verificar eso. ¡El hecho de que tiene un método abstracto que no ha sido implementado tiene prioridad y falla por eso!
Así es como uno usaría la BasicPokemonclase.
from collections import namedtuple
Attack = namedtuple('Attack', ('name', 'damage'))
class Pikachu(BasicPokemon):
def main_attack(self):
return Attack('Thunder Shock', 5)
class Charmander(BasicPokemon):
def main_attack(self):
return Attack('Flame Thrower', 5)
Tenga en cuenta que también puede crear propiedades abstractas utilizando el mismo abstractmethoddecorador.
from abc import (
ABC,
abstractmethod,
)
class BasicPokemon(ABC):
def __init__(self, name):
self.name = name
@property
@abstractmethod
def level(self):
...
@abstractmethod
def main_attack(self):
...
class Pikachu(BasicPokemon):
@property
def level(self):
return 1
def main_attack(self):
return Attack('Thunder Shock', 5)
Algunos de ustedes se estarán preguntando por qué no podemos simplemente usar una clase normal (es decir, no heredar de ABC) y generar una NotImplementerErrorpara métodos que no han sido implementados, como en el ejemplo a continuación.
class NotAbstractBasicPokemon:
def __init__(self, name):
self.name = name
self._level = 1
def main_attack(self):
raise NotImplementedError()
Por el contrario, tratar de crear un objeto a partir de BasicPokemonresultados en un error inmediatamente, como vimos anteriormente.
En el ejemplo que hemos estado usando en esta publicación, BasicPokemonel propósito de era ser usado como modelo para crear otras clases para tipos específicos de Pokémon. Hay algunos beneficios obvios de tener una clase abstracta de la que todos deben heredar para crear un nuevo Pokémon:
En esta publicación, echamos un vistazo a las clases abstractas de Python y cómo nos brindan una forma de describir cómo esperamos que se implementen las subclases y advertir a los usuarios (es decir, a otros programadores o a nosotros mismos en el futuro) cuando las partes críticas no están definidas.
[1]https://docs.python.org/3/library/abc.html
[2]https://realpython.com/python-interface/
Más del mismo autor.
Calcular usando simulaciones de Montecarlo
Cuando realiza una solicitud a facebook.com, su computadora busca el nombre de dominio para traducir ese nombre de dominio en una dirección IP para que su computadora pueda hacer esa conexión.
Debe haber oído hablar de todos los complementos nuevos y potentes de ChatGPT, como el navegador, el intérprete de código, etc. Pero hay un problema, el acceso a los complementos está limitado a una lista de espera y, por lo tanto, muchos no tienen acceso a ellos.
Cualquier mente racional sabe que los círculos políticos y mediáticos están dominados por la izquierda, incluso por la extrema izquierda, una situación que crea un desequilibrio en el discurso político. En el campo de la religión, este desequilibrio es claramente visible: los periódicos y las redes de izquierda no se apresuran a defender la fe cristiana.
Ayer cerramos la puerta del Festival de la Canción de Eurovisión de este año con una gran final brillante y caótica en la que la cantante sueca Loreen se llevó a casa el trofeo, convirtiéndose en la primera mujer en ganar dos veces y devolviendo la corona a Suecia 50 años después de que ABBA ganara la competencia. con “Waterloo”. Se convirtieron en uno de los actos más grandes en el canon de la música pop.
Cuando realiza una solicitud a facebook.com, su computadora busca el nombre de dominio para traducir ese nombre de dominio en una dirección IP para que su computadora pueda hacer esa conexión.