Clases y Objetos

PythonPythonBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderás sobre clases y objetos en Python. Una clase es una plantilla para crear objetos. Un objeto es una instancia de una clase.

Logros

  • Nombres y objetos
  • Alcances y espacios de nombres
  • Objetos de instancia
  • Objetos de método
  • Herencia
  • Variables privadas

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/ObjectOrientedProgrammingGroup(["Object-Oriented Programming"]) python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python/FunctionsGroup -.-> python/function_definition("Function Definition") python/ObjectOrientedProgrammingGroup -.-> python/classes_objects("Classes and Objects") python/ObjectOrientedProgrammingGroup -.-> python/constructor("Constructor") python/ObjectOrientedProgrammingGroup -.-> python/inheritance("Inheritance") python/ObjectOrientedProgrammingGroup -.-> python/encapsulation("Encapsulation") subgraph Lab Skills python/function_definition -.-> lab-71{{"Clases y Objetos"}} python/classes_objects -.-> lab-71{{"Clases y Objetos"}} python/constructor -.-> lab-71{{"Clases y Objetos"}} python/inheritance -.-> lab-71{{"Clases y Objetos"}} python/encapsulation -.-> lab-71{{"Clases y Objetos"}} end

Definiendo y Creando una Clase

Para definir una clase en Python, utiliza la palabra clave class seguida del nombre de la clase.

La definición de la clase debe contener un método __init__, que es un método especial en Python que se llama cuando se crea un objeto a partir de la clase.

Abre un nuevo intérprete de Python.

python3

Aquí tienes un ejemplo de una clase que representa un círculo:

class Circle:
    def __init__(self, radius):
        self.radius = radius

El método __init__ recibe un parámetro radius y lo asigna al atributo radius del objeto.

Instanciando un Objeto de Instancia

Para crear un objeto de instancia a partir de una clase, debes llamar al nombre de la clase seguido de paréntesis. Se le llama "instancia" porque es una ocurrencia específica de la clase.

circle1 = Circle(5)

Esto crea un objeto de instancia circle1 del tipo Circle con un radio de 5. Los objetos de instancia se pueden utilizar para almacenar datos específicos del objeto. Por ejemplo, cada objeto Circle puede tener un radio diferente.

El método __init__ del paso anterior se llamará automáticamente cuando se cree el objeto, y el atributo radius del objeto se inicializará con el valor 5.

El método __init__ se utiliza a menudo para configurar el estado inicial de un objeto, como inicializar los atributos del objeto o establecer conexiones con recursos externos. Se llama automáticamente cuando se crea el objeto, por lo que no tienes que llamarlo tú mismo.

Es importante tener en cuenta que el método __init__ es simplemente un método normal y puede tener cualquier nombre. Sin embargo, la convención de nomenclatura recomendada es utilizar __init__ para dejar claro que es el método inicializador de la clase.

Accediendo y Modificando Atributos

Para acceder a los atributos de un objeto, utiliza la notación de punto. Por ejemplo, para acceder al radio del objeto circle1, puedes utilizar el siguiente código:

print(circle1.radius) ## Output: 5

Puedes modificar los atributos de un objeto asignándoles un nuevo valor. Por ejemplo, para cambiar el radio del objeto circle1, puedes utilizar el siguiente código:

circle1.radius = 10
print(circle1.radius) ## Output: 10

Agregar Objetos Método

Un método es una función que se define dentro de una clase y se utiliza para realizar operaciones sobre los datos almacenados en los atributos de un objeto. En Python, los métodos se definen utilizando la palabra clave def seguida del nombre del método y una lista de parámetros.

Aquí tienes un ejemplo de un método area definido en la clase Circle:

class Circle:
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * self.radius * self.radius

El método area calcula el área de un círculo en función de su radio. Lo hace utilizando el atributo self.radius, que se refiere al radio del objeto en el que se llama al método.

Para llamar a un método en un objeto, utiliza la notación de punto seguida del nombre del método y paréntesis. Por ejemplo, para llamar al método area en el objeto circle1, puedes utilizar el siguiente código:

circle1 = Circle(15)
print(circle1.area()) ## Output: 706.5

Esto imprimirá el área del objeto circle1, que es una instancia específica de la clase Circle.

Los métodos son útiles para encapsular funcionalidad dentro de una clase y proporcionar una forma de operar sobre los datos almacenados en los atributos del objeto.

Los principiantes deben prestar especial atención al uso de paréntesis. Los paréntesis se utilizan para llamar al método en el objeto, y también se utilizan para pasar los parámetros al método. Esto puede resultar confuso al principio, pero se volverá más claro a medida que sigas aprendiendo sobre clases y objetos.

Los objetos de instancia y los objetos método son los dos tipos principales de objetos en Python. En resumen, los objetos de instancia se crean a partir de una clase, y los objetos método se definen dentro de una clase.

Herencia

La herencia es una forma de crear una nueva clase que es una versión modificada de una clase existente. La nueva clase se llama subclase y la clase existente es la superclase.

La herencia te permite crear una subclase que tiene todos los atributos y métodos de la superclase, y también puedes agregar atributos y métodos adicionales a la subclase o sobrescribir los atributos y métodos de la superclase.

Aquí tienes un ejemplo de una subclase Cylinder que hereda de la clase Circle:

class Cylinder(Circle):
    def __init__(self, radius, height):
        super().__init__(radius)
        self.height = height

La clase Cylinder tiene un método __init__ que recibe dos parámetros: radius y height. Llama al método __init__ de la clase Circle utilizando la función super() para inicializar el atributo radius del objeto, y luego establece el atributo height del objeto.

La función super() es una función especial en Python que se refiere a la superclase de una clase. Se utiliza para llamar a métodos de la superclase desde dentro de la subclase.

La función super() se define en la definición de la clase y recibe el parámetro self, que se refiere al objeto que se está creando. También puede recibir parámetros adicionales dependiendo del método que se esté llamando. En este ejemplo, pasa el parámetro radius al método __init__ de la clase Circle e inicializa el atributo radius del objeto.

La clase Cylinder ahora tiene todos los atributos y métodos de la clase Circle, así como el atributo adicional height. Puedes acceder a los atributos y métodos de la clase Cylinder utilizando la notación de punto, al igual que con la clase Circle.

Por ejemplo, puedes crear un objeto Cylinder y acceder a sus atributos de la siguiente manera:

cylinder1 = Cylinder(5, 10)
print(cylinder1.radius)  ## imprime 5
print(cylinder1.height)  ## imprime 10

La herencia es una característica útil en la programación orientada a objetos ya que te permite reutilizar código y crear una jerarquía de clases.

La Función super()

La función super() es útil cuando se desea reutilizar el código de la superclase en la subclase y extenderlo con funcionalidad adicional.

Es importante tener en cuenta que la función super() no es una referencia estática a la superclase. Es una referencia dinámica que cambia dependiendo de la clase en la que se llama. Esto permite utilizar la herencia en múltiples niveles de herencia y acceder a la superclase correcta en cada nivel.

Por ejemplo, considera las siguientes clases:

class A:
    def method(self):
        print("A method")

class B(A):
    def method(self):
        super().method()
        print("B method")

class C(B):
    def method(self):
        super().method()
        print("C method")

Aquí, C es una subclase de B, que a su vez es una subclase de A. Si se llama al método method en un objeto C, primero llamará al método method de la clase A utilizando la función super(), luego al método method de la clase B utilizando la función super(), y finalmente al método method de la clase C.

obj = C()
obj.method()  ## imprime "A method", "B method", "C method"

La función super() es una característica útil en la programación orientada a objetos que permite reutilizar código y crear una jerarquía de clases.

Variables Privadas

En Python, las variables privadas son variables que están destinadas a ser utilizadas solo dentro de la clase en la que se definen, y no por código externo. Las variables privadas no son directamente accesibles desde fuera de la clase.

Para definir una variable privada en la clase Circle, puedes utilizar el prefijo de doble guion bajo (__) seguido del nombre de la variable. Por ejemplo:

class Circle:
    def __init__(self, radius):
        self.__radius = radius

Esto define una variable privada __radius en la clase Circle.

Las variables privadas están destinadas a ser utilizadas solo dentro de la clase en la que se definen. No son directamente accesibles desde fuera de la clase. Por ejemplo, si intentas acceder a la variable __radius desde fuera de la clase Circle, obtendrás un error:

circle1 = Circle(5)
print(circle1.__radius)  ## Esto generará un AttributeError

Las variables privadas son útiles para encapsular datos dentro de una clase y limitar la capacidad del código externo para modificarlos. Sin embargo, es importante tener en cuenta que las variables privadas no son realmente privadas en Python y aún se pueden acceder desde fuera de la clase utilizando "name mangling" (desfiguración de nombres).

La desfiguración de nombres es una técnica que consiste en agregar un prefijo especial al nombre de la variable para dificultar su acceso desde fuera de la clase.

Por ejemplo, la variable __radius aún se puede acceder desde fuera de la clase Circle utilizando la siguiente sintaxis:

print(circle1._Circle__radius)  ## Esto imprimirá 5

Sin embargo, esto no se considera una buena práctica de programación y debe evitarse.

En su lugar, debes utilizar variables privadas solo dentro de la clase en la que se definen y proporcionar métodos públicos para acceder o modificar los datos si es necesario.

Aquí tienes un ejemplo de una clase Circle con una variable privada __radius y métodos públicos para acceder y modificar el radio:

class Circle:
    def __init__(self, radius):
        self.__radius = radius

    def get_radius(self):
        return self.__radius

    def set_radius(self, radius):
        self.__radius = radius

Para acceder al radio de un objeto Circle, puedes utilizar el método get_radius:

circle1 = Circle(5)
print(circle1.get_radius())  ## imprime 5

Para modificar el radio de un objeto Circle, puedes utilizar el método set_radius:

circle1.set_radius(10)
print(circle1.get_radius())  ## imprime 10

Resumen

En este laboratorio, has aprendido sobre clases y objetos en Python. Has aprendido cómo definir una clase, crear un objeto a partir de una clase, acceder a los atributos y métodos de un objeto, modificar los atributos de un objeto y crear una subclase que herede de una superclase.

A continuación, se presenta un resumen de los conceptos principales cubiertos en este laboratorio:

  • Una clase es una plantilla para crear objetos. Un objeto es una instancia de una clase.
  • El método __init__ se llama cuando se crea un objeto a partir de una clase. Te permite establecer los atributos del objeto.
  • Puedes acceder a los atributos de un objeto utilizando la notación de punto y llamar a los métodos de un objeto utilizando la notación de punto seguida del nombre del método y paréntesis.
  • Puedes modificar los atributos de un objeto asignándoles un nuevo valor.
  • La herencia te permite crear una subclase que es una versión modificada de una superclase. La subclase puede sobrescribir o extender los métodos de la superclase.

Espero que este laboratorio te haya ayudado a aprender sobre clases y objetos en Python. ¡Hazme saber si tienes alguna pregunta!