Personalizar funcionalidad mediante herencia

Programación orientada a objetos en Python

Alex Yarosh

Content Quality Analyst @ DataCamp

una jerarquía de clases de cuenta

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 heredada de BankAccount
class SavingsAccount(BankAccount):
    pass
Programación orientada a objetos en Python

Personalizar constructores

class SavingsAccount(BankAccount):    

    # Constructor específico para SavingsAccount con un parámetro adicional
    def __init__(self, balance, interest_rate):  

# Llama al constructor padre usando ClassName.__init__() BankAccount.__init__(self, balance) # <--- self es un SavingsAccount pero también un BankAccount
# Añadir más funcionalidad self.interest_rate = interest_rate
  • Puedes ejecutar el constructor de la clase padre primero con Parent.__init__(self, args...)
  • Añadir más funcionalidad
  • No tienes que llamar a los constructores padres
Programación orientada a objetos en Python

Crear objetos con un constructor personalizado

# Construir el objeto usando el nuevo constructor
acct = SavingsAccount(1000, 0.03)
acct.interest_rate
0.03
Programación orientada a objetos en Python

Añadir funcionalidad

  • Añadir métodos como de costumbre
  • Puedes usar los datos de la clase padre e 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)

Programación orientada a objetos en Python

una jerarquía de clases de cuenta

Programación orientada a objetos en Python

Personalizar funcionalidad

class CheckingAccount(BankAccount):

def __init__(self, balance, limit): BankAccount.__init__(self, balance) self.limit = limit
def deposit(self, amount): self.balance += amount
def withdraw(self, amount, fee=0):
if fee <= self.limit: BankAccount.withdraw(self, amount + fee) else: BankAccount.withdraw(self, amount + self.limit)
  • Puedes cambiar la firma (añadir parámetros)
  • Usa Parent.method(self, args...) para llamar a un método de la clase padre
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() recibió un argumento
 inesperado 'fee'
Programación orientada a objetos en Python

¡Vamos a practicar!

Programación orientada a objetos en Python

Preparing Video For Download...