Ir al contenido principal

Clases internas en Python

En este tutorial básico de Python, aprenderás por qué y cuándo deberías usar clases internas.
Actualizado 17 sept 2026  · 5 min leer

Explorar con IA

ChatGPTClaudePerplexity

Probablemente hayas oído hablar de las funciones anidadas en Python. Si sabes qué son, entender las clases internas/anidadas no tiene misterio. Aquí exploraremos algunos aspectos nuevos de las clases internas o anidadas.

1. Clases internas o anidadas

Una clase interna o anidada se define dentro de otra clase. Observa la estructura de las clases internas o anidadas.

## clase externa
class Outer:

    ## clase interna
    class Inner:
        pass

        ## clase interna multinivel
        class InnerInner:
            pass

    ## otra clase interna
    class _Inner:
        pass

    ## ...

    pass

Ejecuta y edita el código de este tutorial en línea

Ejecutar código

2. ¿Por qué usar clases internas?

  1. Agrupar dos o más clases. Supongamos que tienes dos clases: Car y Engine. Todo Car necesita un Engine. Pero un Engine no se usará sin un Car. Así que conviertes Engine en una clase interna de Car. Ayuda a simplificar el código.

  2. Ocultar implementación es otro uso de las clases anidadas. Puedes ocultarlas del mundo exterior.

  3. Facilitan la comprensión. Las clases están estrechamente relacionadas y no tienes que buscarlas por el código: están juntas.

Las clases internas o anidadas no son de las características más habituales en Python, pero pueden ser muy útiles. El código resulta muy sencillo de organizar cuando usas clases internas o anidadas.

3. Programar clases internas

Implementar clases internas o anidadas no es complicado. Puedes ver la estructura del código aquí.

Puedes acceder a la clase interna desde la clase externa usando la palabra clave self. Así, puedes crear rápidamente una instancia de la clase interna y operar con ella en la clase externa según necesites. Sin embargo, no puedes acceder a la clase externa desde una clase interna. Veamos un ejemplo:

class Outer:
    """Outer Class"""

    def __init__(self):
        ## instantiating the 'Inner' class
        self.inner = self.Inner()

    def reveal(self):
        ## calling the 'Inner' class function display
        self.inner.inner_display("Calling Inner class function from Outer class")

    class Inner:
        """Inner Class"""

        def inner_display(self, msg):
            print(msg)

Ahora crea una instancia de la clase Outer y llama a su método reveal() para ejecutar el método inner_display() de la clase Inner.

## creating an instance of the 'Outer' class
outer = Outer()
## calling the 'reveal()' method
outer.reveal()
Calling Inner class function from Outer class

Veamos otra forma de acceder a la clase interna. Este enfoque es algo menos eficiente.

Outer().Inner().inner_display("Calling the Inner class method directly")
Calling the Inner class method directly

¿Y si quieres crear una instancia de la clase interna fuera de la clase externa? ¿Se puede? Sí. Mira cómo crear una instancia de la clase interna fuera de la externa:

outer = Outer()

## instantiating the inner class
inner = outer.Inner() ## inner = Outer().Inner() or inner = outer.inner
inner.inner_display("Just Print It!")
Just Print It!

3.1. Varias clases internas

Es una clase que contiene más de una clase interna. Puedes tener varias clases internas dentro de una clase. Como ya comentamos, es sencillo implementarlas.

class Outer:
    """Outer Class"""

    def __init__(self):
        ## Instantiating the 'Inner' class
        self.inner = self.Inner()
        ## Instantiating the '_Inner' class
        self._inner = self._Inner()

    def show_classes(self):
        print("This is Outer class")
        print(inner)
        print(_inner)

    class Inner:
        """First Inner Class"""

        def inner_display(self, msg):
            print("This is Inner class")
            print(msg)

    class _Inner:
        """Second Inner Class"""

        def inner_display(self, msg):
            print("This is _Inner class")
            print(msg)

    ## ...

El acceso a las clases se hace igual que antes. Mira el ejemplo para entenderlo mejor.

## instantiating the classes

## 'Outer' class
outer = Outer()
## 'Inner' class
inner = outer.Inner() ## inner = outer.inner or inner = Outer().Inner()
## '_Inner' class
_inner = outer._Inner() ## _inner = outer._outer or _inner = Outer()._Inner()

## calling the methods
outer.show_classes()

print()

## 'Inner' class
inner.inner_display("Just Print It!")

print()

## '_Inner' class
_inner.inner_display("Just Show It!")
This is Outer class
<__main__.Outer.Inner object at 0x0000021B37962048>
<__main__.Outer._Inner object at 0x0000021B37962160>

This is Inner class
Just Print It!

This is _Inner class
Just Show It!

3.2. Clases internas multinivel

En las clases internas multinivel, la clase interna contiene otra clase que a su vez es interna respecto a la anterior. Puedes ver la estructura de esta jerarquía aquí:

class Outer:
    """Outer Class"""

    def __init__(self):
        ## instantiating the 'Inner' class
        self.inner = self.Inner()
        ## instantiating the multilevel 'InnerInner' class
        self.innerinner = self.inner.InnerInner()

    def show_classes(self):
        print("This is Outer class")
        print(inner)

    ## inner class
    class Inner:
        """First Inner Class"""

        def __init__(self):
            ## instantiating the 'InnerInner' class
            self.innerinner = self.InnerInner()

        def show_classes(self):
            print("This is Inner class")
            print(self.innerinner)

        ## multilevel inner class
        class InnerInner:

            def inner_display(self, msg):
                print("This is multilevel InnerInner class")
                print(msg)

        def inner_display(self, msg):
            print("This is Inner class")
            print(msg)

    ## ...

Veamos cómo instanciar la clase interna multinivel.

outer = Outer()

inner = outer.Inner()

## this is 'InnerInner' class instance
innerinner = inner.InnerInner() ## innerinner = Outer().Inner().InnerInner()

## let's call its method inner_display
innerinner.inner_display("Just Print It!")
This is multilevel InnerInner class
Just Print It!

Conclusión

Espero que ahora tengas claro el concepto de clases internas. Es hora de que experimentes con clases anidadas. ¡Feliz programación! :)

Si quieres profundizar en clases, echa un vistazo al tutorial de programación orientada a objetos (OOP) en Python de DataCamp.

haz el curso Object-Oriented Programming in Python de DataCamp.

Temas
Python

Más sobre Python

Curso

Programación orientada a objetos en Python

4 h
105.2K
Profundiza en tus conocimientos y aprende a crear clases y aprovechar la herencia y el polimorfismo para reutilizar y optimizar el código.
Ver detallesRight Arrow
Iniciar Curso
Ver másRight Arrow
Relacionado

Tutorial

Programación orientada a objetos (POO) en Python: Tutorial

Aborda los fundamentos de la Programación Orientada a Objetos (POO) en Python: explora las clases, los objetos, los métodos de instancia, los atributos y ¡mucho más!
Théo Vanderheyden's photo

Théo Vanderheyden

12 min

Tutorial

Funciones en Python: cómo llamar y escribir funciones

Descubre cómo escribir funciones en Python reutilizables y eficientes. Domina los parámetros, las sentencias return y temas avanzados como las funciones lambda. Organiza mejor tu código con main() y otras buenas prácticas.
Karlijn Willems's photo

Karlijn Willems

14 min

Tutorial

Clases abstractas en Python: Una guía completa con ejemplos

Aprende sobre las clases abstractas de Python, su finalidad y cómo utilizar el módulo `abc` para aplicar interfaces coherentes. Incluye ejemplos prácticos y mejores prácticas para una implementación eficaz.
Derrick Mwiti's photo

Derrick Mwiti

10 min

Tutorial

Tutorial de Python sobre conjuntos y teoría de conjuntos

Aprende sobre los conjuntos en Python: qué son, cómo crearlos, cuándo usarlos, funciones incorporadas y su relación con las operaciones de la teoría de conjuntos.
DataCamp Team's photo

DataCamp Team

13 min

Tutorial

Tutorial de Estructuras de Datos en Python

Introdúcete en las estructuras de datos de Python: aprende más sobre tipos de datos y estructuras de datos primitivas y no primitivas, como cadenas, listas, pilas, etc.
Sejal Jaiswal's photo

Sejal Jaiswal

24 min

Tutorial

Tutorial de módulos de Python: Importarlos, escribirlos y utilizarlos

Aprende a crear e importar módulos de Python. ¡Descubre las mejores prácticas, ejemplos y consejos para escribir código Python reutilizable, organizado y eficiente!

Nishant Kumar

8 min

Ver MásVer Más