Programación orientada a objetos en Python
Alex Yarosh
Content Quality Analyst @ DataCamp

# 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
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

La clase base debe ser intercambiable con cualquiera de sus subclases sin alterar propiedades del programa
→ 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
→ Cambiar atributos adicionales en el método de la subclase
→ Lanzar excepciones adicionales en el método de la subclase
$$\text{\textbf{\Huge{Sin LSP -- Sin Herencia}}}$$
Programación orientada a objetos en Python