Dominando Objetos y Clases en Python: Guía Práctica
Objetos y Clases en Python
Este tutorial explora las características centrales orientadas a objetos de Python, guiándote a través de la creación de clases, instanciación y mejores prácticas para código robusto.
Video: Clases y Objetos en Python
Objetos y Clases en Python
Python es fundamentalmente orientado a objetos. Mientras la programación procedural se enfoca en funciones, la POO centra en objetos que agrupan datos y comportamiento.
Un objeto es un paquete de atributos (datos) y métodos (funciones). Una clase es el plano que define la estructura de un objeto.
Piensa en una clase como el plano de una casa —detallando habitaciones, puertas, ventanas. Cada casa construida es un objeto, o instancia, creado desde ese plano.
Múltiples objetos pueden construirse desde la misma clase. La instanciación es el proceso de crear un objeto desde una clase.
Definir una Clase en Python
Las definiciones de clase empiezan con la palabra clave class, similar a como las funciones empiezan con def. La primera cadena en una clase es el docstring, proporcionando una descripción concisa.
class MiNuevaClase:
'''Este es un docstring. He creado una nueva clase'''
pass
Definir una clase establece un nuevo espacio de nombres para sus atributos, que pueden ser datos o métodos. Atributos especiales que empiezan con doble guion bajo, como __doc__, contienen metadatos como el docstring.
Una vez definida, se crea un objeto clase y puede usarse para acceder a atributos o instanciar nuevos objetos.
class Persona:
"Esta es una clase persona"
edad = 10
def saludar(self):
print('Hola')
# Salida: 10
print(Persona.edad)
# Salida: <function Persona.saludar>
print(Persona.saludar)
# Salida: "Esta es una clase persona"
print(Persona.__doc__)
Salida
10 <function Persona.saludar at 0x7fc78c6e8160> Esta es una clase persona
Crear un Objeto en Python
Las clases sirven como fábricas de objetos. La instanciación se asemeja a una llamada de función:
>>> harry = Persona()
El objeto resultante harry puede acceder a atributos de clase via notación de punto. Los métodos de clase se convierten en métodos ligados en la instancia.
class Persona:
"Esta es una clase persona"
edad = 10
def saludar(self):
print('Hola')
# crear un nuevo objeto de la clase Persona
harry = Persona()
# Salida: <function Persona.saludar>
print(Persona.saludar)
# Salida: <bound method Persona.saludar of <__main__.Persona object>>
print(harry.saludar)
# Llamar al método saludar() del objeto
# Salida: Hola
harry.saludar()
Salida
<function Persona.saludar at 0x7fd288e4e160> <bound method Persona.saludar of <__main__.Persona object at 0x7fd288e9fa30>> Hola
Observa el parámetro self en definiciones de métodos. Cuando un método se llama en una instancia, Python pasa automáticamente la instancia como primer argumento, permitiendo que harry.saludar() se ejecute sin proporcionar explícitamente self.
Por convención, se usa self, aunque cualquier nombre es sintácticamente válido. Seguir esta convención mejora la legibilidad y alinea con estándares de la comunidad.
Constructores en Python
Métodos especiales prefijados con doble guion bajo realizan roles especiales. El método __init__, invocado al instanciar, actúa como constructor, inicializando el estado de la instancia.
class NumeroComplejo:
def __init__(self, r=0, i=0):
self.real = r
self.imag = i
def get_data(self):
print(f'{self.real}+{self.imag}j')
# Crear un nuevo objeto NumeroComplejo
num1 = NumeroComplejo(2, 3)
# Llamar método get_data()
# Salida: 2+3j
num1.get_data()
# Crear otro objeto NumeroComplejo
# y añadir atributo dinámico 'attr'
num2 = NumeroComplejo(5)
num2.attr = 10
# Salida: (5, 0, 10)
print((num2.real, num2.imag, num2.attr))
# Acceder a atributo faltante lanza error
print(num1.attr)
Salida
2+3j (5, 0, 10) Traceback (most recent call last): File "<string>", line 27, in <module> print(num1.attr) AttributeError: 'NumeroComplejo' object has no attribute 'attr'
Este ejemplo demuestra que atributos pueden añadirse dinámicamente a instancias individuales sin afectar a otras.
Eliminar Atributos y Objetos
Los atributos pueden eliminarse con la sentencia del. Eliminar el método o atributo de clase afecta llamadas subsiguientes.
>>> num1 = NumeroComplejo(2,3)
>>> del num1.imag
>>> num1.get_data()
Traceback (most recent call last):
... AttributeError: 'NumeroComplejo' object has no attribute 'imag'
>>> del NumeroComplejo.get_data
>>> num1.get_data()
Traceback (most recent call last):
... AttributeError: 'NumeroComplejo' object has no attribute 'get_data'
Los objetos mismos pueden eliminarse. Eliminar la referencia libera el nombre; si no existen otras referencias, el objeto es recolectado por el garbage collector automáticamente.
>>> c1 = NumeroComplejo(1,3)
>>> del c1
>>> c1
Traceback (most recent call last):
... NameError: name 'c1' is not defined
En Python, la gestión de memoria se maneja por conteo de referencias y un garbage collector cíclico, asegurando limpieza eficiente de recursos.

python
- Clases y objetos en C#: Fundamentos para POO robusta
- Dominando clases y métodos abstractos en C#: Guía práctica
- Entendiendo clases y métodos parciales en C#
- Dominando clases y métodos sealed en C#: Cuándo usarlos, ejemplos claros y mejora de seguridad y rendimiento
- Clases y Objetos en C++: Guía Práctica de Programación Orientada a Objetos
- Funciones y clases amigas en C++: dominando el control de acceso
- Palabras clave e identificadores en Python: Dominando palabras reservadas y convenciones de nomenclatura
- Sentencias, indentación y comentarios en Python: Guía clara
- Dominando Operaciones de Directorios y Archivos en Python
- Dominando Excepciones Personalizadas en Python: Guía Práctica
- Dominando la Herencia en Python: Conceptos, Sintaxis y Ejemplos Prácticos