Hemos visto como definimos atributos en una clase anteponiendo la palabra clave self:
class Persona: def __init__(self,nombre): self.nombre=nombre
Los atributos son independientes por cada objeto o instancia de la clase, es decir si definimos tres objetos de la clase Persona, todas las personas tienen un atributo nombre pero cada uno tiene un valor independiente:
class Persona: def __init__(self,nombre): self.nombre=nombre # bloque principal persona1=Persona("Juan") persona2=Persona("Ana") persona3=Persona("Luis") print(persona1.nombre) # Juan print(persona2.nombre) # Ana print(persona3.nombre) # Luis
En algunas situaciones necesitamos almacenar datos que sean compartidos por todos los objetos de dicha clase, en esas situaciones debemos emplear variables de clase.
Para definir una variable de clase lo hacemos dentro de la clase pero fuera de sus métodos:
class Persona: variable=20 def __init__(self,nombre): self.nombre=nombre # bloque principal persona1=Persona("Juan") persona2=Persona("Ana") persona3=Persona("Luis") print(persona1.nombre) # Juan print(persona2.nombre) # Ana print(persona3.nombre) # Luis print(persona1.variable) # 20 Persona.variable=5 print(persona2.variable) # 5
Se reserva solo un espacio para la variable "variable", independientemente que se definan muchos objetos de la clase Persona. La variable "variable" es compartida por todos los objetos persona1,persona2 y persona3.
Para modificar la variable de clase hacemos referencia al nombre de la clase y seguidamente el nombre de la variable:
Persona.variable=5
Definir una clase Cliente que almacene un código de cliente y un nombre.
En la clase Cliente definir una variable de clase de tipo lista que almacene todos los clientes que tienen suspendidas sus cuentas corrientes.
Imprimir por pantalla todos los datos de clientes y el estado que se encuentra su cuenta corriente.
class Cliente: suspendidos=[] def __init__(self,codigo,nombre): self.codigo=codigo self.nombre=nombre def imprimir(self): print("Codigo:",self.codigo) print("Nombre:",self.nombre) self.esta_suspendido() def esta_suspendido(self): if self.codigo in Cliente.suspendidos: print("Esta suspendido") else: print("No esta suspendido") print("_____________________________") def suspender(self): Cliente.suspendidos.append(self.codigo) # bloque principal cliente1=Cliente(1,"Juan") cliente2=Cliente(2,"Ana") cliente3=Cliente(3,"Diego") cliente4=Cliente(4,"Pedro") cliente3.suspender() cliente4.suspender() cliente1.imprimir() cliente2.imprimir() cliente3.imprimir() cliente4.imprimir() print(Cliente.suspendidos)
La clase Cliente define una variable de clase llamada suspendidos que es de tipo lista y por ser variable de clase es compartida por todos los objetos que definamos de dicha clase:
class Cliente: suspendidos=[]
En el método imprimir mostramos el código, nombre del cliente y si se encuentra suspendida su cuenta corriente:
def imprimir(self): print("Codigo:",self.codigo) print("Nombre:",self.nombre) self.esta_suspendido()
El método suspender lo que hace es agregar el código de dicho cliente a la lista de clientes suspendidos:
def suspender(self): Cliente.suspendidos.append(self.codigo)
El método que analiza si está suspendido el cliente verifica si su codigo se encuentra almacenado en la variable de clase suspendidos:
def esta_suspendido(self): if self.codigo in Cliente.suspendidos: print("Esta suspendido") else: print("No esta suspendido") print("_____________________________")
Para probar esta clase en el bloque principal creamos cuatro objetos de la clase Cliente:
# bloque principal cliente1=Cliente(1,"Juan") cliente2=Cliente(2,"Ana") cliente3=Cliente(3,"Diego") cliente4=Cliente(4,"Pedro")
Suspendemos dos clientes:
cliente3.suspender() cliente4.suspender()
Y luego imprimimos los datos de cada cliente:
cliente1.imprimir() cliente2.imprimir() cliente3.imprimir() cliente4.imprimir()
Podemos imprimir la variable de clase suspendidos de la clase Cliente:
print(Cliente.suspendidos)
Es importante remarcar que todos los objetos acceden a una única lista llamada suspendidos gracias a que se definió como variable de clase.
ejercicio204.py class Jugador: tiempo=30 def __init__(self, nombre, puntaje): self.nombre=nombre self.puntaje=puntaje def imprimir(self): print("Nombre:",self.nombre) print("Puntaje:",self.puntaje) print("Fin de juego en",Jugador.tiempo,"minutos") def pasar_minuto(self): Jugador.tiempo=Jugador.tiempo-1 # bloque principal jugador1=Jugador("Juan",100) jugador2=Jugador("Ana",50) while Jugador.tiempo>0: jugador1.imprimir() jugador2.imprimir() jugador1.pasar_minuto()