Programação orientada a objetos em Python
Alex Yarosh
Content Quality Analyst @ DataCamp

# Retirar valor de cada conta em 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(), # depois CheckingAccount.withdraw(), # depois SavingsAccount.withdraw()
batch_withdraw() não precisa verificar o objeto para saber qual withdraw() chamar
A classe base deve ser intercambiável com qualquer uma de suas subclasses sem alterar as propriedades do programa
Onde BankAccount funciona, CheckingAccount também deve funcionar

A classe base deve ser intercambiável com qualquer uma de suas subclasses sem alterar as propriedades do programa
→ Incompatibilidade sintática
BankAccount.withdraw() requer 1 parâmetro, mas CheckingAccount.withdraw() requer 2
→ Subclasse reforçando condições de entrada
BankAccount.withdraw() aceita qualquer valor, mas CheckingAccount.withdraw() assume que o valor é limitado
→ Subclasse enfraquecendo condições de saída
BankAccount.withdraw() só pode deixar saldo positivo ou causar erro, CheckingAccount.withdraw() pode deixar saldo negativo
→ Alterando atributos adicionais no método da subclasse
→ Lançando exceções adicionais no método da subclasse
$$\text{\textbf{\Huge{Sem LSP -- Sem Herança}}}$$
Programação orientada a objetos em Python