No puedo encontrar mucha ventaja en ellos además del tipo de propósito de la documentación. Python me advertirá si olvido implementar un método que definí en un ABC, pero como no hago referencia a mis objetos por sus interfaces, puedo olvidarme de declarar métodos en sus interfaces y no lo notaré. ¿Es una práctica común utilizar ABC para un comportamiento parecido a una interfaz?¿Es pitónico utilizar interfaces/clases base abstractas?
Respuesta
Personalmente, considero que las clases abstractas son más útiles cuando escribo bibliotecas u otro código que interactúa entre un desarrollador y otro.
Una de las ventajas de los lenguajes de tipo estático es que cuando se utiliza el tipo incorrecto, falla antes (a menudo, tan pronto como el tiempo de compilación). Los ABC permiten a Python obtener la misma ventaja con el tipado dinámico.
Si su código de biblioteca escribe un objeto que carece de un método vital, probablemente no fallará hasta que se necesite ese método (lo que podría demorar mucho tiempo o poner los recursos en un estado incoherente, dependiendo de cómo se use). Sin embargo, con el ABC, un método faltante no usa el ABC correcto (y falla una verificación instanceof
) o es "validado" por ABC.
Además, los ABC son una excelente manera de documentar interfaces, tanto conceptualmente como, a través de documentos, literalmente.
AFAIK, la práctica estándar ha sido utilizar la excepción NotImplementedError
para los métodos abstractos no implementados.
Pero creo que ABC podría considerarse pitónico, ya que ahora es part of the Python standard library.
- 1. Grandes clases base abstractas
- 2. Herencia ambigua de clases base abstractas:
- 3. ¿Es pitónico usar bools como ints?
- 4. ¿Es pitónico imitar la sobrecarga de métodos?
- 5. ¿Por qué csv.reader no es pitónico?
- 6. C# Propiedades en clases base abstractas
- 7. Diseño pitónico sin enums
- 8. Elegante cumsum pitónico
- 9. ¿Cuál es la ventaja de utilizar clases abstractas en lugar de rasgos?
- 10. Convirtiendo a mayúsculas. ¿Qué camino es más pitónico?
- 11. Cómo crear propiedades abstractas en las clases abstractas de Python
- 12. de Python(), las clases base abstractas y NotImplementedError
- 13. ¿Múltiples clases abstractas derivadas?
- 14. equivalente pitónico de unshift o rehacer?
- 15. ¿Cuál es la forma correcta de sobrecargar a los operadores en clases base abstractas?
- 16. Cuando es apropiado utilizar una base de datos, en Python
- 17. Clases selladas abstractas
- 18. setattr con kwargs, pitónico o no?
- 19. modelar una clase base y subclases abstractas en una base de datos
- 20. referencias abstractas a interfaces genéricas
- 21. métodos estáticos abstractas en Scala
- 22. ¿Las fábricas abstractas usan "nuevo"?
- 23. JAXB y clases abstractas
- 24. Funciones privadas abstractas
- 25. AS3 - clases abstractas
- 26. ¿Constructores en clases abstractas?
- 27. Interfaces vs. clases abstractas
- 28. Clases abstractas en relaciones GORM
- 29. Pregunta sobre fábricas abstractas e inyección
- 30. clase e interfaz abstractas puras