Clases en Python

¿Qué es una clase?

Podemos decir que una clase es un objeto definido por el usuario en el que se definen una serie de atributos para cada cualquier objeto dentro de la misma. Los atributos son datos, instancias o variables y métodos. De forma llana, podemos decir que una clase en un lugar donde almacenar métodos, junto con variables u otros elementos, accesibles todos ellos dentro de un mismo código. Llamando a este código o clase tendremos acceso a todos esos elementos con una sola llamada. Una clase puede ser llamada desde diferentes lugares y ejecutarse de forma simultánea sin ningún conflicto, mientras que si se hiciese mediante funciones definidas por el usuario si podría darse ese conflicto.

Hagamos ahora un repaso a los términos empleados en relación a las clases:

  • Variable de clase. Una variable dentro de una clase es una variable a la que tienen acceso todas las instancias de la clase.
  • Variable de dato. Es una variable de clase asociada a los objetos de la clase.
  • Variable de instancia. Es una variable definida dentro de un método y que tiene valor solamente dentro de dicho instancia de la clase. Viene a ser una variable local.
  • Herencia. Es la transferencia de ciertas características de una clase a otra clase derivada a partir de ella. Por ejemplo, pensemos en una clase «animales» con todas las características comunes de diferentes animales y después otras clases derivadas de ellas como pueden ser «perros» y «gatos«que comparten las características de la clase animales pero tiene además ciertas características propias.
  • Instancia. Es cualquier objeto individual dentro de una clase. Por ejemplo, si tenemos cuatro gatos, cada uno con un nombre, y les llamamos usando la clase gatos, el nombre de cada uno de ellos sería una instancia de la clase.
  • Inicialización. Es el proceso de llamar a la clase. Es posible que nada más iniciar la clase se ejecuten ciertos métodos o se establezca el valor de ciertas variables.
  • Método. Es una función definida dentro de una clase. Es, por tanto, una función dentro de una clase.
  • Objeto. Es una instancia única dentro de la estructura de datos de una clase. Comprende tanto las variables de clase, como las variables de instancia o los propios métodos.

Veamos un primer ejemplo:

class Person:
    def __init__(self,gender,name):
        self.gender = gender
        self.name = name
    def display(self,value):
        print "You're a ",self.gender, ", and your name is ",self.name, " and look at this value: ", value
    
people1 = Person("male","Jose Manuel")
people2 = Person ("female", "Ana")
people1.display(33)
people2.display(22)

Debemos observar lo siguiente:

  • La clase se define mediate class seguido por el nombre de la clase y dos puntos, como en cualquier función.
  • Se define un primer método __init__ (función pre construida en Python) donde se va a pasar dos variables gendername que llegan a la clase cuando esta es iniciada. Estas entradas se asocian ahora con el objeto self y se usan en el resto de la clase. No es obligatorio llamar a este método en primer lugar, pero es interesante desde que nos permite tener asignados los valores de ciertas variables dentro de toda la clase.
  • Un segundo método display tiene como entradas self, definido anteriormente. Este método simplemente escribe una frase empleando estas dos variables, en este caso.
  • Una vez definida la clase, puede iniciarse en cualquier lugar del código.
  • Para iniciar la clase Person se le pasan los dos valores que precisa esta clase y se asigna a las variables people1people2. De este modo podremos llamar a los métodos de la clase Person a través de estas variables, cada una de las cuales son ahora dos instancia u objetos de la clase Person.
  • Una vez iniciada la clase, puede llamarse a cualquiera de sus métodos. Vemos que en la llamada al método display le estamos pasando externamente el valor que queremos que tome la variable value en esta llamada al método.

Es posible pasar a la clase un diccionario o una tupla de cualquier tamaño. En el siguiente ejemplo estamos pasando un diccionario, indicado por el doble asterisco (**). Si fuese una tupla emplearíamos un solo asterisco (*).

class Example:
    def __init__(self,**dictionary):
        self.variables = dictionary
    def set_vars(self,k,v):
        self.variables[k] = v
    def get_vars(self,k):
        return self.variables.get(k)
    
var = Example(Edad=18,Nombre="Ana")
var.set_vars('talla','36')
print var.get_vars('talla')
print var.get_vars('Edad'), var.get_vars('Nombre')

Podemos ver como al crear la instancia var para la clase Example estamos pasando un diccionario (indice,valor). El método set_vars puede recibir las variables mediante self (por defecto) o hacerlas llegar al llamar al método. En cualquier caso, lo que enviamos son siemrpe dos parámetos que se entenderán como índice (key, k) y valor (value, v).

Por último, veamos el concepto de herencia con un ejemplo:

class Animals:
    def eat(self):
        print 'I can eat'
    def talk(self):
        print 'I can talk'

class Cats(Animals):
    def talk(self):
        print 'Meow'
    def move(self):
        print 'I can move'

class Dogs (Animals):
    pass
        
animal_1 = Cats()
animal_2 = Dogs()

animal_1.talk()
animal_2.talk()
animal_1.eat()
animal_2.eat()

En primer lugar, hemos creado la clase Animals con los métodos  eattalk. A continuación creamos la clase  Cats que hereda los métodos de Animals al escribir el nombre de esta clase entre los paréntesis de definición de la primera. Sin embargo, el método talk se define de nuevo en Cats con lo que tendrá prioridad en cualquier instancia de la clase Cats. Al definir la clase Dogs, simplemente escribimos pass, lo cual quiere decir que hereda todos los métodos y resto de objetos de la clase padre.

Esto es todo por ahora respecto a las clases en Python. Continuaremos con otros aspectos en este repaso en próximos posts.