Prestamo
¶tasa_interes
es común para todas las instancias de la clase Prestamo
.monto
y plazo
son atributos de instancia, son específicos para cada instancia de la clase Prestamo
.calcular_interes
es un método que calcula el interés del préstamo utilizando tanto el atributo de clase como los atributos de instancia.class Prestamo:
# Atributo de clase
tasa_interes = 0.005 # es un 0,5% mensual, lo que equivale a un TIN del 6% anual
def __init__(self, monto, plazo):
# Atributos de instancia
self.monto = monto
self.plazo = plazo
def calcular_interes(self):
interes = self.monto * self.plazo * Prestamo.tasa_interes
return interes
# Crear una instancia de la clase Prestamo
p = Prestamo(1000, 12)
# Acceder a los atributos de instancia
print(p.monto) # Output: 1000
print(p.plazo) # Output: 12
# Acceder al atributo de clase
print(Prestamo.tasa_interes) # Output: 0.005
# Calcular el interés del préstamo
interes = p.calcular_interes()
print(interes) # Output: 60.0
1000 12 0.005 60.0
Usuario
¶class Usuario:
# Atributo de clase
num_usuarios = 0
def __init__(self, nombre, edad):
# Atributos de instancia
self.nombre = nombre
self.edad = edad
# Incrementar el número de usuarios
Usuario.num_usuarios += 1
def saludar(self):
print(f"Hola, mi nombre es {self.nombre} y tengo {self.edad} años.")
# Crear dos instancias de la clase Usuario
u1 = Usuario("Juan", 25)
u2 = Usuario("María", 30)
# Acceder a los atributos de instancia
print(u1.nombre) # Output: Juan
print(u2.edad) # Output: 30
# Acceder al atributo de clase
print(Usuario.num_usuarios) # Output: 2
# Llamar al método saludar
u1.saludar() # Output: Hola, mi nombre es Juan y tengo 25 años.
u2.saludar() # Output: Hola, mi nombre es María y tengo 30 años.
Juan 30 2 Hola, mi nombre es Juan y tengo 25 años. Hola, mi nombre es María y tengo 30 años.
class Ejemplo:
def metodo1(self):
print("Este es el método 1.")
self.metodo2()
def metodo2(self):
print("Este es el método 2.")
e = Ejemplo()
e.metodo1()
Este es el método 1. Este es el método 2.
__dict__
¶__dict__
es un diccionario que contiene los atributos de un objeto.Laptop
con los atributos de instancia marca
y modelo
.Laptop
llamada l
.__dict__
para acceder al diccionario de atributos del objeto y para agregar el nuevo atributo pantalla
.class Laptop:
# Atributos de clase
bateria = "Integrada"
conector = "HDMI"
def __init__(self, marca, modelo):
self.marca = marca
self.modelo = modelo
l1 = Laptop("Lenovo", "ThinkPad")
l2 = Laptop("MacBook", "Air")
# podemos acceder al atributo de clase como propiedad de clase
print(Laptop.bateria)
# podemos acceder al atributo de clase como propiedad de instancia
print(l2.bateria) # Accedemos al atributo batería del objeto creado
# Acceder al diccionario de atributos del objeto
print(l1.__dict__) # Output: {'marca': 'Lenovo', 'modelo': 'ThinkPad'}
# Agregar un nuevo atributo al objeto
l1.pantalla = "4K"
print(l1.__dict__) # Output: {'marca': 'Lenovo', 'modelo': 'ThinkPad', 'pantalla': '4K'}
Integrada Integrada {'marca': 'Lenovo', 'modelo': 'ThinkPad'} {'marca': 'Lenovo', 'modelo': 'ThinkPad', 'pantalla': '4K'}
¿Cómo es posible que al poner l2.bateria
no de error ya que bateria
es un atributo de clase y lo estoy aplicando sobre la instancia l2
?
Esto se debe a que se sigue este orden de actuación:
Al escribir l2.bateria
Python mira a ver si bateria
existe como atributo de instancia y como no es así pasa al paso 2 y mira a ver si bateria
existe como atributo de clase, y como si es así, entonces imprime el valor de bateria
como atributo de clase, pese a que lo estamos aplicando sobre l2
que es una instancia.
print(id(Laptop.bateria)) # da el ID del atributo de clase bateria
print(id(l2.bateria)) # da el mismo ID porque se trata del mismo atributo
140130402966000 140130402966000
print(l2.conector)
print(id(l2.conector))
# queremos cambiar la asignación del atributo
l2.conector = "USB-C" # pero en realidad estamos creando uno nuevo
# el motivo es que el atributo conector es de clase y no de instancia
# y cuando no existe el atributo de instancia se usa el de clase
# pero solo para LECTURA
l2.autonomia = 300 # Así añadimos un atributo nuevo al objeto de forma dinámica
# Esto también es lo que se hizo cuando se añadío el conector USB-C
# era un atributo nuevo, distindo del atributo de clase del mismo nombre
print(l2.conector)
print(id(l2.conector)) # podemos comprobar que es un nuevo atributo ya que el ID es diferente
print(l2.__dict__) # podemos comprobar que ahora el conector de tipo USB-C es el
# atributo de la instancia l2 ya que se encuentra el diccionario
# Output: {'marca': 'MacBook', 'modelo': 'Air', 'conector': 'USB-C'}
USB-C 140305896094576 USB-C 140305496240176 {'marca': 'MacBook', 'modelo': 'Air', 'conector': 'USB-C'}