Objetos y clases con Python

Objetos POO Python

Podríamos decir que, en la POO de Python, los objetos son un conjunto de datos y acciones que están agrupados. Comprender que existe esta agrupación de características (atributos) y acciones (métodos) llamada objeto es fundamental para entender la programación orientada a objetos en Python y en cualquier lenguaje de programación.

  • Parte estática del objeto: características o atributos del objeto.
  • Parte dinámica: operaciones o métodos que puede realizar el objeto.

En la programación orientada a objetos, casi todo lo que tenemos a nuestro alrededor lo podríamos considerar un objeto: usuario, cliente, televisión, vehículo, etc.

Vamos a ver un ejemplo del objeto consola1.

Consola1

  • Atributos o características
    • marca: Sega
    • modelo: Megadrive
    • tipo: 16 bits
    • color: negro
    • lanzamiento: 1988
    • soporte: cartuchos
  • Métodos o acciones
    • Encender
    • Apagar
    • Leer cartucho Sega

Clases POO Python

Dentro de la programación orientada a objetos de Python, podemos ver las clases como el molde desde el que se pueden crear objetos.

Dentro de las clases, vamos a poder definir las características y funciones para crear objetos.

Vamos a escribir con Python la clase con la que se podría crear el objeto que hemos visto anteriormente consola1. Recuerda que el nombre de las clases comienza con la primera letra en mayúsculas (convención de estilo en Python).

Incluiremos las características (atributos) y acciones (métodos).

class Consolas:
    marca = ''
    modelo = ''
    tipo = ''
    color = ''
    lanzamiento = 0
    soporte = 0

    def encender(self):
        print('La consola está encendida...')
    def apagar(self):
        print('La consola está apagada...')
    def leo_cartucho_megadrive(self):
        print('Cargando juego...')

Todas las propiedades de una clase de Python son públicas y pueden ser modificadas. Existe una convención de agregarle una barra baja _ para indicar que esa propiedad o método no debe modificarse fuera de la clase.

De los métodos no hablaremos nada en esta entrada (excepto de __init__()), vamos a ver los métodos de POO en Python por separado. Únicamente debes tener en cuenta que los métodos son las acciones que se pueden realizar con un objeto y que se definen igual que las funciones de Python.

Crear objeto a partir de una clase

Ahora que tenemos nuestra clase Consolas creada, vamos a crear un objeto. Lo primero que debemos hacer es crear una instancia de nuestra clase.

¿Pero qué es crear una instancia de nuestra clase?

Siguiendo la similitud anterior de que la clase es una especie de molde, podríamos decir que instanciar la clase es utilizar algún material, introducirlo en nuestro molde y obtener un objeto como resultado. Obviamente este objeto va a tener la forma de nuestro molde, que vendrá dada por las características y las acciones definidas en la clase.

Podemos decir que nuestro nuevo objeto es una instancia de la clase, ya que deriva de ella.

Creo el primer objeto llamado consola1 y obtengo un objeto que deriva de Consolas con determinadas características y acciones definidas en la clase.

consola1 = Consolas()

Una vez creado nuestro objeto, podemos acceder a un listado de todas sus características (atributos) y acciones (métodos) mediante la función de Python dir().

consola1 = Consolas()
print(dir(consola1))

# ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'apagar', 'color', 'encender', 'lanzamiento', 'leo_cartucho_megadrive', 'marca', 'modelo', 'soporte', 'tipo']

Podemos ver en este listado que, aparte de lo que Python agrega por defecto para este tipo de objeto, aparecen nuestros atributos y métodos: marca, modelo, tipo, color, lanzamiento y soporte (como atributos); y encender, apagar y leo_cartucho_megadrive (como métodos).

Objetos y clases POO Python

Con la clase Consolas podemos crear tantos objetos como sea necesario para nuestro programa, pero tenemos que darnos cuenta de una cosa: todavía nuestros objetos no tienen valor. Nuestra clase cuando crea un objeto asigna un valor en blanco → ‘ ‘ a los atributos de tipo texto y valor cero → 0 a los de tipo número.

Vamos a crear dos objetos con valores diferentes para que puedan diferenciarse uno del otro.

Función __init__() de Python

Añadiremos la función __init__(), que se ejecuta siempre cuando se instancia la clase. Con esta función inicializaremos nuestro objeto y asignaremos valores a la propiedades o agregaremos las operaciones que necesitemos.

No hay que olvidar que el parámetro self hace referencia al objeto desde donde estamos llamando a la clase.

Creamos consola1 y consola2.

class Consolas:
    def __init__(self, marca, modelo, tipo, color, lanzamiento, soporte):
        self.marca = marca
        self.modelo = modelo
        self.tipo = tipo
        self.color = color
        self.lanzamiento = lanzamiento
        self.soporte = soporte
    
    def encender(self):
        print('La consola está encendida...')
    def apagar(self):
        print('La consola está apagada...')
    def leo_cartucho_megadrive(self):
        print('Cargando juego...')
    
consola1 = Consolas('Sega', 'Megadrive', '16 bits', 'negro', '1988', 'cartuchos')
consola2 = Consolas('NES', 'Nintendo', '8 bits', 'gris', '1983', 'cartuchos')

Podemos ver que consola1 y consola2 son objetos del mismo tipo.

print(type(consola1))
print(type(consola2))

# <class '__main__.Consolas'>
# <class '__main__.Consolas'>

En cambio, si imprimimos en pantalla el valor de alguna de sus propiedades, vemos que son diferentes.

print(consola1.color)
print(consola2.color)

# negro
# gris

Ahora podemos llamar a cualquier método que hayamos definido desde nuestros objetos.

Vamos a encender consola1 y le diremos que lea el cartucho Sega.

consola1.encender()
consola1.leo_cartucho_megadrive()

# La consola está encendida...
# Cargando juego...

Modificar propiedad de objeto con Python

Ahora modificaremos la propiedad color para consola1. Vamos a indicar que la consola no es de color negro, sino negro y rojo.

consola1.color = 'negro y rojo'
print(consola1.color)

# negro y rojo

Podemos modificar las propiedades que sean necesarias en cada momento.

Eliminar propiedad de objeto con Python

También podemos eliminar con la palabra clave del propiedades de un objeto siempre que lo necesitemos.

En este ejemplo eliminaremos la propiedad color que acabamos de modificar en el ejemplo anterior. Al intentar imprimirla en pantalla nos mostrará un error.

del consola1.color
print(consola1.color)

# AttributeError: 'Consolas' object has no attribute 'color'

A continuación, vamos a imprimir el valor de la propiedad color de los dos objetos que hemos creado. Para consola1, mostrará un error, ya que lo hemos borrado; pero para consola2 nos mostrará correctamente que su color es gris.

del consola1.color
print(f'Valor de color en consola2:  {consola2.color}')
print(consola1.color)

# Valor de color en consola2:  gris
# AttributeError: 'Consolas' object has no attribute 'color'

Eliminar objeto

Podemos eliminar un objeto completo con la palabra reservada del. En este ejemplo eliminaremos consola1 y después intentaremos imprimir el tipo de objeto en pantalla.

del consola1
print(type.consola1)

# NameError: name 'consola1' is not defined. Did you mean: 'consola2'?

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *