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
Podemos ver a las clases dentro de la programación orientada a objetos de Python 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 nuestros 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 comienzan 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 _ indicando 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 nuestro 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 serán las características y 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 el 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 nos haga falta para nuestro programa, pero tenemos que darnos cuenta de una cosa, ahora 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, que sirva para diferenciar a un objeto de 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.
Recuerda que el parámetro self hace referencia al objeto desde dónde 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 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 negra, si no negra y roja.
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 que acabamos de modificar en el ejemplo anterior color. Ahora cuando intentemos imprimirla en pantalla nos mostrará un error.
del consola1.color
print(consola1.color)
# AttributeError: 'Consolas' object has no attribute 'color'
Ahora 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. Vamos a ver un ejemplo eliminando consola1, después intentaremos imprimir el tipo en pantalla.
del consola1
print(type.consola1)
# NameError: name 'consola1' is not defined. Did you mean: 'consola2'?