48 - Variables de clase

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

Problema 1:

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.

Programa: ejercicio203.py

Ver video

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.

Problema propuesto

  • Plantear una clase llamada Jugador.
    Definir en la clase Jugador los atributos nombre y puntaje, y los métodos __init__, imprimir y pasar_tiempo (que debe reducir en uno la variable de clase).
    Declarar dentro de la clase Jugador una variable de clase que indique cuantos minutos falta para el fin de juego (iniciarla con el valor 30)
    Definir en el bloque principal dos objetos de la clase Jugador.
    Reducir dicha variable hasta llegar a cero.

    Ver video

Solución
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()