Personalizar funcionalidad con herencia

Introducción a la programación orientada a objetos en Python

George Boorman

Curriculum Manager, DataCamp

Una jerarquía de clases de cuentas bancarias

Introducción a la programación orientada a objetos en Python

Lo que tenemos hasta ahora

class BankAccount:
    def __init__(self, balance):
       self.balance = balance

    def withdraw(self, amount):
       self.balance -=amount

# Clase vacía que hereda de BankAccount
class SavingsAccount(BankAccount):
    pass
Introducción a la programación orientada a objetos en Python

Personalizar constructores

class SavingsAccount(BankAccount):    
    # Constructor de SavingsAccount con un argumento adicional
    def __init__(self, balance, interest_rate):  

# Llama al constructor del padre con ClassName.__init__() # self es SavingsAccount y también BankAccount BankAccount.__init__(self, balance)
# Añade más funcionalidad self.interest_rate = interest_rate
  • Puedes ejecutar primero el constructor del padre con Parent.__init__(self, args...)
  • Añade más funcionalidad
  • No tienes que llamar al constructor del padre
Introducción a la programación orientada a objetos en Python

Crear objetos con un constructor personalizado

# Construye el objeto con el nuevo constructor
acct = SavingsAccount(1000, 0.03)
acct.interest_rate
0.03
Introducción a la programación orientada a objetos en Python

Añadir funcionalidad

  • Añade métodos como siempre
  • Puedes usar datos tanto del padre como de la hija
class SavingsAccount(BankAccount):
    def __init__(self, balance, interest_rate):
        BankAccount.__init__(self, balance)
        self.interest_rate = interest_rate

    # Nueva funcionalidad
    def compute_interest(self, n_periods=1):
        return self.balance * ( (1 + self.interest_rate) ** n_periods - 1)
Introducción a la programación orientada a objetos en Python

Una jerarquía de clases de cuentas bancarias

Introducción a la programación orientada a objetos en Python

Añadir una segunda subclase

class CheckingAccount(BankAccount):

def __init__(self, balance, limit): BankAccount.__init__(self, balance) # Llama al constructor de la clase padre self.limit = limit
def deposit(self, amount): self.balance += amount
def withdraw(self, amount, fee=0): # Nuevo argumento fee
if amount <= self.limit: BankAccount.withdraw(self, amount + fee) else: pass # No se ejecuta si no se cumple la condición
Introducción a la programación orientada a objetos en Python
check_acct = CheckingAccount(1000, 25)

# Llamará a withdraw de CheckingAccount
check_acct.withdraw(200)

# Llamará a withdraw de CheckingAccount check_acct.withdraw(200, fee=15)
bank_acct = BankAccount(1000)

# Llamará a withdraw de BankAccount
bank_acct.withdraw(200)

# Producirá un error bank_acct.withdraw(200, fee=15)
TypeError: withdraw() got an unexpected
keyword argument 'fee'
  • Viola el polimorfismo
    • La clase padre y la hija tienen métodos distintos
Introducción a la programación orientada a objetos en Python

¡Vamos a practicar!

Introducción a la programación orientada a objetos en Python

Preparing Video For Download...