Diseñando para herencia y polimorfismo

Programación orientada a objetos en Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Polimorfismo

 

 

Usando una interfaz unificada para operar en objetos de diferentes clases

Programación orientada a objetos en Python

jerarquía de clases de cuenta

Programación orientada a objetos en Python

Lo que importa es la interfaz

# Retirar cantidad de cada cuenta en list_of_accounts
def batch_withdraw(list_of_accounts, amount):
   for acct in list_of_accounts:
      acct.withdraw(amount)

b, c, s = BankAccount(1000), CheckingAccount(2000), SavingsAccount(3000) batch_withdraw([b,c,s]) # <-- Usará BankAccount.withdraw(), # luego CheckingAccount.withdraw(), # luego SavingsAccount.withdraw()
  • batch_withdraw() no necesita verificar el objeto para saber qué withdraw() llamar
Programación orientada a objetos en Python

Principio de sustitución de Liskov

 

La clase base debe ser intercambiable con cualquiera de sus subclases sin alterar propiedades del programa

Donde BankAccount funcione, CheckingAccount también debería funcionar

foto de Barbara Liskov

Programación orientada a objetos en Python

Principio de sustitución de Liskov

 

La clase base debe ser intercambiable con cualquiera de sus subclases sin alterar propiedades del programa

Sintácticamente
  • firmas de funciones compatibles
    • argumentos, valores devueltos
Semánticamente
  • el estado del objeto y del programa permanece consistente
    • el método de la subclase no fortalece condiciones de entrada
    • el método de la subclase no debilita condiciones de salida
    • sin excepciones adicionales
Programación orientada a objetos en Python

Violación del LSP

Incompatibilidad sintáctica

BankAccount.withdraw() requiere 1 parámetro, pero CheckingAccount.withdraw() requiere 2

Fortalecimiento de condiciones de entrada en subclase

BankAccount.withdraw() acepta cualquier cantidad, pero CheckingAccount.withdraw() asume que la cantidad es limitada

Debilitamiento de condiciones de salida en subclase

BankAccount.withdraw() solo puede dejar un saldo positivo o causar un error, CheckingAccount.withdraw() puede dejar saldo negativo

Programación orientada a objetos en Python

Violación del LSP

→ Cambiar atributos adicionales en el método de la subclase

→ Lanzar excepciones adicionales en el método de la subclase

Programación orientada a objetos en Python

 

 

 

 

$$\text{\textbf{\Huge{Sin LSP -- Sin Herencia}}}$$

Programación orientada a objetos en Python

¡Vamos a practicar!

Programación orientada a objetos en Python

Preparing Video For Download...