Saltar al contenido principal

Explicación de los métodos privados de Python

Aprende sobre los métodos privados en Python, su sintaxis, cómo y cuándo utilizarlos en tus proyectos mediante ejemplos, y las mejores prácticas.
Actualizado 16 ene 2025  · 9 min de lectura

En la Programación Orientada a Objetos (POO), un enfoque de diseño de software, utilizamos "objetos" para modelar entidades del mundo real. Un objeto es una estructura de datos con atributos (datos) y métodos (funciones) que actúan sobre los datos. Los sistemas complejos pueden ser más fáciles de diseñar con objetos.

Aprende más sobre los fundamentos y los conceptos de ingeniería de software que hay detrás de laprogramación orientada a objetos iniciando nuestrocurso de programación orientada a objetos con Python.

La encapsulación es un concepto fundamental de la programación orientada a objetos. Significa agrupar los datos y los métodos de un objeto y ocultar los detalles al mundo exterior. Piensa en la encapsulación como un proceso que crea una "cápsula" (un objeto) con sus propios datos y formas de manipularlos.

El objetivo principal de la encapsulación es:

  • Impedir el acceso directo a los datos (integridad de los datos).
  • Simplifica el sistema mostrando sólo lo necesario (abstracción).

Los métodos privados son la clave para lograr esta encapsulación, ocultando los detalles de la implementación interna de una clase.

Al hacer privado un método, indicas a otros programadores que no está previsto que se acceda directamente a ese método. Esto puede evitar fallos y errores al garantizar que el estado interno de un objeto sólo puede modificarse de forma controlada.

Aquí presentaremos los métodos privados, la sintaxis para definirlos, la implementación de métodos privados en ejemplos del mundo real y las mejores prácticas para utilizarlos.

¿Qué son los métodos privados?

Los métodos privados en programación orientada a objetos (POO) son funciones dentro de una clase diseñadas sólo para uso interno. Encapsulan la funcionalidad de una clase, asegurando que su funcionamiento interno permanezca protegido de la interacción externa.

Esta encapsulación proporciona una capa de abstracción, que permite a la clase mantener el control sobre su estado y comportamiento internos y cambiar su implementación sin afectar al código externo que depende de ella.

En Python, la convención para indicar métodos privados es anteponer al nombre del método un guión bajo simple (_) o un guión bajo doble (__). Esto sirve de pista a los desarrolladores sobre el alcance previsto del método y es una mera convención.

Aunque esta convención no impone una privacidad estricta como en otros lenguajes, es una práctica muy respetada dentro de la comunidad Python para señalar el uso previsto del método. Más adelante, profundizaremos en estos aspectos de forma más exhaustiva.

La sintaxis de los métodos privados

Hay dos formas distintas de definir métodos privados, que veremos a través de ejemplos.

Podemos definir un método privado anteponiendo un guión bajo al nombre de la función:

class MyClass:
   def _private_method(self):
       print("This is a private method")

Esta definición no es más que una convención para los programadores, ya que la función sigue siendo accesible fuera de la clase, aunque no es recomendable.

Si es la primera vez que oyes hablar de las clases en Python, te recomendamos que primero consultes nuestro tutorial para principiantes sobre Clases.

Creemos un objeto e intentemos acceder al método privado creado:

# Creating an object
obj = MyClass()

# Accessing from outside
obj._private_method()  # Not recommended to call directly, but possible

Existe otra sintaxis para definir métodos privados en Python utilizando guiones bajos dobles. Tiene el siguiente aspecto: :

class MyClass:
   def __private_method(self):
       print("This is a private method")

obj = MyClass()
# obj.__private_method()  # This will raise an AttributeError

Cuando intentamos acceder al método privado desde fuera de la clase, lanza un AttributeError, indicando que no se puede acceder directamente utilizando el nombre de la función.

Para resumir la sintaxis de los métodos privados en Python:

  • Guión bajo simple: mera convención para los programadores, se puede acceder a él fuera de la función.
  • Doble guión bajo: no se puede acceder fuera de la función sólo con el nombre de la función. Todavía se puede acceder a él mediante la "Manipulación de nombres", que veremos más adelante en este tutorial.

Implementar métodos privados en Python

Como ejemplo del mundo real, considera una clase BankAccount segura y fácil de usar para gestionar las transacciones financieras de un usuario. Los requisitos de las cuentas bancarias son:

  • La clase debe encapsular el saldo del titular de la cuenta, permitiendo ingresos y retiradas, pero garantizando que el saldo no pueda manipularse directamente fuera de la clase.
  • La clase debe facilitar las transferencias seguras entre cuentas, actualizando el saldo de la cuenta receptora sin exponer el mecanismo interno de modificación del saldo.
  • La solución debe adherirse a los principios de la programación orientada a objetos, concretamente a la encapsulación y la abstracción, para mantener la integridad de los datos de la cuenta y proporcionar una interfaz clara y sencilla para interactuar con ella.

Por supuesto, una cuenta bancaria necesita más funcionalidades, como la comprobación del saldo, la conversión de divisas y la gestión de intereses, pero para simplificar las cosas, las ignoraremos en nuestra implementación.

Pongamos en práctica esta solución y entendamos el código.

class BankAccount:
   def __init__(self, account_holder, initial_balance=0):
       self.account_holder = account_holder
       self.__balance = initial_balance  # Private attribute

   def deposit(self, amount):
       if amount > 0:
           self.__balance += amount
           print(f"Deposited ${amount}. New balance: ${self.__balance}")
       else:
           print("Deposit amount must be positive.")

   def withdraw(self, amount):
       if 0 < amount <= self.__balance:
           self.__balance -= amount
           print(f"Withdrew ${amount}. New balance: ${self.__balance}")
       else:
           print("Insufficient funds or invalid amount.")

   def __update_balance(self, amount):  # Private method
       self.__balance += amount

   def transfer(self, amount, other_account):
       if 0 < amount <= self.__balance:
           self.withdraw(amount)
           other_account.__update_balance(amount)
           print(f"Transferred ${amount} to {other_account.account_holder}.")
       else:
           print("Insufficient funds or invalid amount.")

Primero creamos un BankAccountclass, que envuelve todos los comportamientos previstos y la funcionalidad requerida por un objeto Cuenta bancaria.

La clase BankAccount tiene un atributo privado __balance y un método privado __update_balance:

  • Variable privada (__balance): Es un atributo de la clase BankAccount que almacena el saldo de la cuenta corriente. Se marca como privada anteponiendo a su nombre dos guiones bajos (__). Esto significa que sólo se puede acceder a ella dentro de la propia clase. Por ejemplo, se modifica mediante los métodos de depósito, withdraw, y __update_balance. No se recomienda el acceso externo a este atributo.
  • Método privado (__update_balance): La finalidad de este método es actualizar el saldo de la cuenta. Es llamado por el método transfer para actualizar el saldo de la cuenta del destinatario durante una operación de transferencia. Utilizar aquí un método privado ayuda a encapsular la lógica de actualización del saldo, asegurando que sólo pueda hacerse de forma controlada y definida por la clase.

Puedes crear un nuevo archivo Python, copiar y pegar el código de arriba y el de abajo, y ejecutarlo para verlo tú mismo.

# Using the Bank Account Solution
account1 = BankAccount("John Doe", 1000)
account2 = BankAccount("Jane Doe", 500)

account1.deposit(200)
account1.withdraw(100)
account1.transfer(300, account2)

Verás el resultado a continuación:

Deposited $200. New balance: $1200
Withdrew $100. New balance: $1100
Withdrew $300. New balance: $800
Transferred $300 to Jane Doe.

Enhorabuena. ¡Has creado tu solución BankAccount utilizando un método privado!

Según la salida, vemos que al realizar las operaciones bancarias habituales, como depositar, retirar y transferir fondos, se sigue el comportamiento lógico habitual de una cuenta bancaria.

El método __init__: ¿es un método privado?

Probablemente te hayas fijado en el método __init__ utilizado en el ejemplo de la Cuenta Bancaria. Como también utiliza la sintaxis del doble guión bajo, puedes preguntarte si también es un método privado.

El método __init__ no se considera un método privado del mismo modo que los métodos prefijados con doble guión bajo por privacidad.

En cambio, forma parte de métodos especiales en Python, a menudo denominados métodos "dunder" (abreviatura de "doble guión bajo"), que tienen una finalidad específica en el lenguaje. Otros ejemplos de estos métodos especiales son __str__, __repr__ y __del__.

Comprendamos cómo se utilizó este método especial en nuestro ejemplo:

class BankAccount:
   def __init__(self, account_holder, initial_balance=0):
       self.account_holder = account_holder
       self.__balance = initial_balance

Como vemos, el método __init__ es el constructor de una clase. Se llama automáticamente cuando se crea una nueva instancia de la clase, y se utiliza para inicializar los atributos del objeto. Para la clase BankAccount, el método __init__ se utiliza para establecer los valores iniciales de los atributos account_holder y __balance.

Conceptos avanzados: Manipulación de nombres en Python

Anteriormente en nuestra definición, mencionamos que los métodos privados en Python son simplemente una convención, y el lenguaje Python no impone estrictamente la privacidad, a diferencia de otros lenguajes de programación.

Con razón, vimos que se podía acceder directamente a los métodos privados cuando se utilizaba un guión bajo simple, pero el acceso estaba restringido cuando se utilizaba un guión bajo doble.

Pero, ¿por qué? Debido a un concepto llamado "name mangling" en Python.

Cuando antepones un guión bajo doble al nombre de un atributo, Python modifica automáticamente el nombre añadiendo un guión bajo sencillo y el nombre de la clase antes del nombre original del atributo.

Este nombre modificado es la forma en que el atributo se almacena internamente dentro de la clase. El proceso de modificar el nombre de esta forma se conoce como manipulación del nombre.

Manipular nombres es útil por dos razones:

  • Evitar conflictos de nombres: En herencia, si una subclase define un atributo con el mismo nombre que un atributo de su superclase, ambos entrarían en conflicto. La combinación de nombres ayuda a evitar este problema, garantizando que los nombres sean únicos para cada clase.
  • Un cierto grado de privacidad: Aunque Python no tiene verdaderos atributos privados, la manipulación de nombres proporciona una forma de hacer que los atributos sean menos accesibles desde fuera de la clase, ofreciendo así cierto grado de privacidad.

Veamos un ejemplo para entenderlo mejor.

class MyClass:
   def __init__(self):
       self.__private_attribute = "I am private"

   def __private_method(self):
       print("This is a private method")

obj = MyClass()
print(obj.__private_attribute)  # This will raise an AttributeError

En este ejemplo, __private_attribute y __private_method tienen el mismo nombre. Internamente, se almacenan como _MyClass__private_attribute y _MyClass__private_method, respectivamente. Si intentas acceder a ellos utilizando sus nombres originales desde fuera de la clase, se producirá un error AttributeError.

Sin embargo, aún puedes acceder a ellos utilizando sus nombres modificados:

print(obj._MyClass__private_attribute)  # This will print "I am private"
obj._MyClass__private_method()  # This will print "This is a private method"

Aunque la manipulación de nombres hace que los atributos sean menos accesibles, es importante tener en cuenta que no es una forma infalible de garantizar la privacidad en Python. Es más bien una convención para indicar que un atributo está destinado a un uso interno dentro de la clase.

Buenas prácticas para utilizar métodos y variables privados

Aprovechar eficazmente los métodos y variables privados exige atenerse a ciertas prácticas recomendadas. Estas prácticas ayudan a garantizar que tu código no sólo sea funcional, sino también claro, mantenible y seguro.

Aquí tienes algunas buenas prácticas a seguir:

  • Utiliza un guión bajo para los atributos "Protegidos". Si quieres indicar que un atributo o método está destinado a ser utilizado dentro de la clase y sus subclases, pero no para uso externo, ponle como prefijo un guión bajo (_). Se trata de una convención de Python que indica a otros desarrolladores que el atributo o método está "protegido" y no se debe acceder a él directamente.
  • Utiliza doble guión bajo para los atributos "Privado". Si quieres que un atributo o método sea menos accesible fuera de la clase para evitar modificaciones o usos accidentales, ponle como prefijo un guión bajo doble (__). Esto provoca la manipulación del nombre y hace más difícil (pero no imposible) acceder al atributo o método desde fuera de la clase.
  • Utiliza métodos privados para la lógica interna. Los métodos privados (los que tienen un prefijo de guión bajo simple o doble) son una forma estupenda de encapsular la lógica interna de tu clase. Utilízalos para realizar tareas que son específicas de la implementación de la clase y que no deben exponerse como parte de la interfaz pública de la clase.

Por último, es importante que seas coherente con tus mejores prácticas de codificación. Cíñete a las convenciones de nomenclatura y utilízalas de forma coherente en todo tu código base. Esto hace que tu código sea más fácil de entender y mantener para otros desarrolladores y para tu futuro yo.

Conclusión

Este tutorial te ha introducido en los conceptos que hay detrás de los métodos privados, su sintaxis y cuándo puedes utilizarlos. También vimos múltiples ejemplos que ilustran cómo puedes utilizarlos potencialmente en tu próximo proyecto de codificación. Por último, examinamos algunas buenas prácticas que debes tener en cuenta al utilizarlos.

Para seguir aprendiendo, puedes consultar el Curso de Habilidades de Programación en Python y el Curso de Programación Orientada a Objetos en Python.


Arunn Thevapalan's photo
Author
Arunn Thevapalan
LinkedIn
Twitter

Como científico de datos senior, diseño, desarrollo e implanto soluciones de aprendizaje automático a gran escala para ayudar a las empresas a tomar mejores decisiones basadas en datos. Como escritora de ciencia de datos, comparto aprendizajes, consejos profesionales y tutoriales prácticos en profundidad.

Temas

Continúa tu viaje de aprendizaje de Python

curso

Data Privacy and Anonymization in Python

4 hr
3K
Learn to process sensitive information with privacy-preserving techniques.
Ver detallesRight Arrow
Comienza el curso
Ver másRight Arrow
Relacionado

tutorial

Cómo recortar una cadena en Python: Tres métodos diferentes

Aprenda los fundamentos del recorte de caracteres iniciales y finales de una cadena en Python.
Adel Nehme's photo

Adel Nehme

5 min

tutorial

Cómo comentar un bloque de código en Python

Utilizar comentarios es fundamental para trabajar eficazmente con Python. En este breve tutorial, aprenderás a comentar un bloque de código en Python.
Adel Nehme's photo

Adel Nehme

3 min

tutorial

Guía completa de listas vacías en Python

Aprenda las principales operaciones con listas y los casos de uso de las listas vacías en Python.
Adel Nehme's photo

Adel Nehme

5 min

tutorial

Exponentes en Python: Guía completa para principiantes

Domina los exponentes en Python utilizando diversos métodos, desde funciones integradas hasta potentes bibliotecas como NumPy, y aprovéchalos en situaciones reales para profundizar en su comprensión.
Satyam Tripathi's photo

Satyam Tripathi

9 min

tutorial

Tutorial y Ejemplos de Funciones y Métodos de Listas en Python

Conozca las funciones y métodos de lista de Python. Siga ahora ejemplos de código de list() y otras funciones y métodos de Python.
Abid Ali Awan's photo

Abid Ali Awan

7 min

Ver másVer más