Una clase es una plantilla o molde que define las características y comportamientos que los objetos creados a partir de ella tendrán. En términos simples, una clase agrupa datos (atributos) y funciones (métodos) que operan sobre esos datos.
class Persona:
# Constructor, se ejecuta al crear un objeto
def __init__(self, nombre, edad):
self.nombre = nombre # Atributo de la clase
self.edad = edad # Atributo de la clase
# Método de la clase
def saludar(self):
return f"Hola, mi nombre es {self.nombre} y tengo {self.edad} años."
__init__
es el constructor, que se usa para inicializar los atributos al crear un objeto.self
es una referencia al propio objeto y se utiliza para acceder a los atributos y métodos dentro de la clase.Un objeto es una instancia de una clase. Es decir, cuando creas un objeto, estás usando la clase como molde para construir una entidad concreta con valores específicos para sus atributos.
# Crear un objeto a partir de la clase Persona
persona1 = Persona("Ana", 30)
# Acceder a un método del objeto
print(persona1.saludar()) # Output: "Hola, mi nombre es Ana y tengo 30 años."
Persona
.Las clases pueden heredar de otras clases, lo que permite reutilizar código y extender funcionalidades.
class Estudiante(Persona):
def __init__(self, nombre, edad, carrera):
super().__init__(nombre, edad) # Llama al constructor de Persona
self.carrera = carrera
def info_estudiante(self):
return f"{self.saludar()} Estudio {self.carrera}."
Estudiante hereda de Persona, lo que significa que tiene todos sus atributos y métodos, pero también puede definir nuevos o sobrescribir existentes.
Los atributos y métodos pueden ser públicos o privados. Por defecto, los atributos privados se nombran con un guion bajo (_).
class Persona:
def __init__(self, nombre, edad):
self._nombre = nombre # Atributo "protegido"
Aunque Python no tiene un verdadero sistema de atributos privados como otros lenguajes (Java, C++), se puede usar la convención de un solo o doble guion bajo para marcar atributos como «privados» y limitar su acceso.
class Persona:
def __init__(self, nombre, edad):
self.nombre = nombre # Atributo público
self.edad = edad # Atributo público
def mostrar_datos(self):
return f"Nombre: {self.nombre}, Edad: {self.edad}"
# Crear un objeto
persona1 = Persona("Carlos", 25)
# Acceder directamente a los atributos públicos
print(persona1.nombre) # Output: Carlos
print(persona1.edad) # Output: 25
En este caso, tanto nombre como edad son públicos, lo que significa que podemos acceder y modificar estos atributos directamente desde fuera de la clase.
Un atributo privado se define con doble guion bajo __
al inicio, lo que «esconde» ese atributo, haciendo que no sea directamente accesible desde fuera de la clase.
class Persona:
def __init__(self, nombre, edad, saldo):
self.nombre = nombre # Atributo público
self.edad = edad # Atributo público
self.__saldo = saldo # Atributo privado
def mostrar_datos(self):
return f"Nombre: {self.nombre}, Edad: {self.edad}, Saldo: {self.__saldo}"
def modificar_saldo(self, nuevo_saldo):
if nuevo_saldo >= 0:
self.__saldo = nuevo_saldo
else:
print("El saldo no puede ser negativo.")
# Crear un objeto
persona1 = Persona("Ana", 30, 5000)
# Acceso a atributos públicos
print(persona1.nombre) # Output: Ana
print(persona1.edad) # Output: 30
# Intentar acceder al atributo privado
try:
print(persona1.__saldo) # Error: AttributeError
except AttributeError:
print("No se puede acceder directamente al atributo privado __saldo.")
# Usar un método para acceder o modificar el atributo privado
print(persona1.mostrar_datos()) # Output: Nombre: Ana, Edad: 30, Saldo: 5000
persona1.modificar_saldo(6000)
print(persona1.mostrar_datos()) # Output: Nombre: Ana, Edad: 30, Saldo: 6000
nombre
y edad
son atributos públicos, por lo que se pueden acceder directamente.
__saldo
es un atributo privado, y no se puede acceder directamente desde fuera de la clase. Intentar hacerlo lanza un error (AttributeError)
.
Para interactuar con el atributo privado, se definen métodos que permiten modificar o leer el valor, como mostrar_datos()
y modificar_saldo()
.
El atributo privado __saldo
está sujeto a name mangling, lo que significa que internamente Python lo renombra a _Persona__saldo para evitar conflictos, por lo que aún se puede acceder si se usa este nombre:
print(persona1._Persona__saldo) # Output: 5000
Esta práctica no es recomendada, ya que viola la encapsulación y el propósito de hacerlo «privado».