Saltar a un capítulo clave
Crear una Clase en Python: Guía paso a paso
Antes de entrar en detalles, es importante entender qué es una clase. Una clase es un plano o plantilla para crear objetos (una estructura de datos específica) en Python. Te permite definir atributos y métodos que compartirán todas las instancias de la clase.
Definir la clase
Para definir una clase en Python, utiliza la palabra claveclass seguida
del nombre de la clase y dos puntos. La estructura general es la siguiente:clase NombreClase: # cuerpoclaseEnel cuerpo de la clase, puedes definir atributos y métodos que compartirán todas las instancias de la clase. Por ejemplo, vamos a crear una simple clase
Coche
:clase Coche: # cuerpo de la clase pasar # Esto es un marcador de posición. Debes sustituirlo por el contenido real.
Añadir métodos a la clase
Los métodos son funciones que operan sobre el estado del objeto. En Python, puedes definir un método utilizando la palabra clavedef
, seguida del nombre del método y de un paréntesis. En el paréntesis, debes incluir el parámetro self
como primer argumento posicional. El parámetro self
se refiere a la instancia de la propia clase. He aquí un ejemplo de adición de métodos a la clase Coche
:class Coche: def arrancar_motor(self): print("¡Motor arrancado!") def parar_motor(self): print("¡Motor parado!")
Instanciar la clase
Para crear una instancia de una clase en Python, basta con llamar al nombre de la clase seguido de un paréntesis. Puedes almacenar la instancia en una variable y luego acceder a sus atributos y métodos utilizando la notación punto. He aquí un ejemplo de creación de una instancia de la claseCoche
y llamada a sus métodos:mi_coche = Coche() # Instanciar la clase Coche mi_coche.arrancar_motor() # Llamar al método arrancar_motor mi_coche.parar_motor() # Llamar al método parar_motor
Como ejemplo más completo, vamos a crear una clase Persona
con atributos (nombre y edad) y métodos (saludo y cumpleaños):
class Persona: def __init__(self, nombre, edad): self.nombre = nombre self.edad = edad def saludo(self): print(f "Hola, me llamo {self.nombre} y tengo {self.edad} años.") def cumpleaños(self): self.edad += 1 print(f "¡Acabo de cumplir {self.edad}!") juan = Persona("Juan", 30) juan.saludo() # Resultado: Hola, me llamo Juan y tengo 30 años. juan.cumpleaños() # Salida: ¡Acabo de cumplir 31 años!
Explorando la Clase Objeto en Python
En Python, todas las clases derivan de la claseobjeto
incorporada, ya sea directa o indirectamente. La clase objeto
sirve de clase base para todas las demás clases y proporciona métodos, atributos y comportamientos comunes que pueden ser heredados por las clases derivadas. Esto garantiza un comportamiento coherente en todas las clases de Python y facilita la reutilización del código al permitir la herencia.Herencia en Python
La herencia es un concepto fundamental en la programación orientada a objetos. Te permite crear nuevas clases basadas en otras existentes, fomentando así la reutilización del código y la modularidad. En Python, puedes heredar atributos y métodos de una clase padre (también conocida como base o superclase) a una clase hija (también conocida como derivada o subclase). La clase hija puede entonces ampliar o anular estos atributos y métodos según sus necesidades.Por ejemplo, considera un ejemplo sencillo de herencia:clase Animal: def saludar(self): print("¡Hola, soy un animal!") clase Perro(Animal): def saludar(self): print("¡Hola, soy un perro!") dog_instance = Perro() dog_instance.greet() # Salida:Hola
, ¡soy un perro!En este ejemplo, la clase
Perro
hereda de la clase Animal
. Como la clase Perro
anula el método greet
, al llamar a dog_instance .greet()
se ejecutará el método definido en la clase Perro
, no el de la clase
Animal.El método __init__
El método __init__
en Python es un método especial que se llama cuando instancias un nuevo objeto de una clase. También se conoce como constructor o inicializador. El objetivo del método __init__
es establecer el estado inicial (atributos) del objeto.
__init__
para una clase Persona
:class Persona: def __init__(self, nombre, edad): self.nombre = nombre self.edad = edadCuando crees un nuevo objeto
Persona
, se llamará automáticamente al método __init__
, que establecerá los atributos
nombre
y edad
del objeto:john = Persona("Juan", 30) print(john.nombre) # Salida: Juan print(juan.edad) # Resultado: 30Cuando se trata de herencia, es habitual llamar al método
__init__
de la clase padre dentro del método __init__
de la clase hija. Esto garantiza que los atributos de la clase padre se establecen correctamente para la clase hijo. Por ejemplo, ampliemos nuestro ejemplo anterior de Animal
y Perro
para incluir los métodos __init__
:class Animal: def __init__(self, species): self.species = species def saludar(self): print(f "¡Hola, soy un {self.species}!") class Perro(Animal): def __init__(self, nombre): super().__init__("perro") self.nombre = nombre def saludar(self): print(f "¡Hola, soy {self.nombre}, un {self.especie}!") dog_instance = Perro("Max") dog_instance.saludar() # Resultado: Hola, soy Max, ¡un perro!Observa el uso de la función
super(
) en el método __init__
de la clase Perro
para llamar al método __init__
de la clase Animal
. Esto establece el atributo especie
para el objeto Perro
, además de añadir el atributo nombre
específico de la clase Perro
.Utilizar propiedades en las clases de Python
En Python, las propiedades son atributos con accesores personalizados, como métodos getter y setter, que controlan su acceso y modificación. Esto añade un nivel de abstracción y encapsulación en la clase, permitiéndote controlar cómo se accede a los atributos y cómo se modifican. La clave para implementar propiedades en las clases Python es el uso de decoradores. Los decoradores son una forma de modificar o mejorar el comportamiento de funciones o métodos con cambios mínimos en la sintaxis. Hay tres decoradores muy conocidos que se utilizan para trabajar con propiedades en Python: 1.@propiedad
: Este decorador declara un método como método getter del atributo. 2. @atributo.setter
: Se utiliza para declarar el método setter para el atributo, permitiendo la modificación del valor de la propiedad.3. @atributo. deleter
: Este decorador declara el método para eliminar completamente el atributo.Implementación de propiedades de sólo lectura
Para implementar una propiedad de sólo lectura, sólo definirás un método getter utilizando el decorador@propiedad
. Esto hace que el atributo sea de sólo lectura, ya que no hay ningún método setter asociado para modificar su valor. He aquí un ejemplo de creación de una clase Circleclass
con una propiedad de sólo lectura para el área del círculo:class Círculo: def __init__(self, radio): self.radio = radio @propiedad def área(self): return 3.14159 * self.radio * self.radioCuandocreas un objeto
Círculo
, puedes acceder a la propiedad área
de la siguiente forma:mi_círculo = Círculo(5) print(mi_círculo.área) # Resultado: 78,53975Observa que accedes al área sin utilizar paréntesis, tratándola como un atributo y no como un método. Recibirás un error si intentas modificar el área directamente, ya que no hay ningún método definidor definido para ella.
Crear definidores para propiedades Python
Para que una propiedad sea modificable, debes definir un método definidor utilizando el decorador@attribute.setter
. Esto te permite modificar el valor de la propiedad mediante un método de acceso controlado. Vamos a ampliar la clase Círculo
, creando un método setter para la propiedad radio, que modifica indirectamente el área.clase Círculo: def __init__(self, radio): self._radio = radio @propiedad def radio(self): return self._radio @radio.setter def radio(self, nuevo_radio): if nuevo_radio < 0: raise ValueError("El radio no puede ser negativo.") self._radio = nuevo_radio @propiedad def área(self): return 3.14159 * self.radio * self.radioEn este ejemplo, el atributo
_radio
se declara como atributo "privado", y su acceso se controla mediante los métodos getter y setter. El método setter garantiza que el valor del radio no puede ser negativo, reforzando la integridad de los datos. Ahora puedes crear un objeto Círculo
y modificar su radio mediante el método setter:mi_círculo = Círculo(5) print(mi_círculo.radio) # Resultado: 5 print(mi_circulo.area) # Resultado: 78,53975 mi_circulo.radio = 7 print(mi_circulo.radio) # Resultado: 7 print(area_mi_circulo) # Resultado: 153.93807999999998Con estos ejemplos, puedes ver cómo las propiedades en las clases de Python permiten un enfoque más controlado y encapsulado para trabajar con atributos, mejorando la estructura y la integridad de tu código.
Dominar el método de clase en Python
En Python, además de los métodos de instancia estándar, hay otros dos tipos de métodos disponibles para su uso dentro de las clases: los métodos estáticos y los métodos de clase. Estos métodos difieren en la forma en que se vinculan a la clase y en los argumentos que aceptan. Se definen mediante los decoradores
@métodoestático
y @métodoclase
, respectivamente.Diferencia entre métodos estáticos y métodos de clase
Métodos estáticos:- No tienen acceso a ningún dato o método específico de la instancia. Funcionan con los argumentos de entrada proporcionados.
- No requieren una instancia para ser invocados.
- Se definen utilizando el decorador
@staticmethod
. - No pueden acceder ni modificar datos específicos de la clase o de la instancia.
- Son adecuados para funciones de utilidad que no dependen del estado de una instancia o de la clase.
class MiClase: @staticmethod def método_estático(arg1, arg2): # Procesa los argumentos return resultadoMétodos de clase:
- Tienen acceso a los datos y métodos de la clase.
- No requieren una instancia para ser invocados, sino que toman como primer argumento la propia clase, normalmente llamada
cls
. - Se definen mediante el decorador
@métodoclase
. - Pueden modificar datos específicos de la clase, pero no pueden acceder directamente a datos específicos de la instancia.
- Son adecuados para los métodos de fábrica, para modificar datos de clase o para trabajar con la herencia.
class MiClase: @classmethod def método_clase(cls, arg1, arg2): # Procesa los argumentos utilizando la clase return resultado
Cuándo utilizar cada método
Elegir entre métodos estáticos y métodos de clase depende de la funcionalidad específica que necesites: 1. Si tu método no requiere acceder a ningún dato de instancia o de clase y sirve puramente como función utilitaria, utiliza un método estático. Esto mejora la claridad de tu código, ya que indica explícitamente que no se está modificando ningún dato de instancia o de clase. 2. Si el método requiere el acceso o la manipulación de datos a nivel de clase o sirve como método de fábrica para crear nuevas instancias, utiliza un método de clase. Esto garantiza que el método pueda acceder y modificar datos específicos de la clase según sea necesario. 3. Si el método depende de datos específicos de una instancia, utiliza un método de instancia.Métodos de clase y herencia
Cuando se trabaja con herencia, los métodos de clase pueden ser muy útiles. Toman automáticamente como primer argumento la clase sobre la que son invocados, lo que les permite trabajar sin problemas con la herencia y las subclases. Esto hace que los métodos de clase sean adecuados para tareas como crear constructores alternativos, manejar configuraciones a nivel de clase o trabajar con datos específicos de una subclase. He aquí un ejemplo que ilustra el uso de métodos de clase en la herencia:class Forma: def __init__(self, lados): self.lados = lados @classmethod def from_vertices(cls, vértices): lados = len(vértices) return cls(lados) class Triángulo(Forma): pass class Cuadrado(Forma): pass triángulo = Triángulo.from_vertices([(0, 0), (1, 1), (1, 2)]) cuadrado = Cuadrado.from_vertices([(0, 0), (0, 1), (1, 1), (1, 0)]) print(triángulo.lados) # Salida: 3 print(cuadrado.lados) # Salida: 4En este ejemplo, el método de clase
from_vertices
puede invocarse en cualquier subclase de Shape
y devolverá una instancia de esa subclase, con el número correcto de lados calculado a partir de los vértices proporcionados. El método sólo se define una vez en la clase Forma
, pero puede utilizarse en cualquier clase derivada, lo que demuestra la versatilidad y compatibilidad hereditaria de los métodos de clase.Mejorar las clases de Python con decoradores de clase
En Python, un decorador es una llamada que toma otra función como argumento y amplía o modifica su comportamiento sin cambiar el código de la función original. Los decoradores de clases tienen un propósito similar, pero se dirigen específicamente a clases en lugar de a funciones. Se utilizan para modificar o mejorar el comportamiento de las clases, permitiendo a los desarrolladores implementar funcionalidades adicionales o reutilizar código de forma limpia y modular.Implementación de decoradores de clases personalizados
Para crear un decorador de clase personalizado, primero debes definir una función o llamada que acepte un único argumento, que es la clase que se va a decorar. Dentro de esta función, puedes modificar directamente la clase de entrada o crear una nueva clase que extienda la clase de entrada, añadiendo o modificando métodos y atributos según sea necesario. Por último, devuelves la clase modificada o la clase extendida, completando así el decorador. He aquí un ejemplo de un sencillo decorador de clase personalizado que añade un métodosaludar
a una clase dada:def añadir_método_saludo(cls): def saludar(yo): print(f "Hola, soy una instancia de la clase {cls.__name__}") # Añade el método saludar a la clase cls.greet = greet return cls @add_greet_method class MyClass: pass instance = MyClass() instance.greet() # Salida: Hola, soy una instancia de la clase MiClase.En este ejemplo, el decorador
add_greet_method
añade el método greet
a la clase MyClass
dada. Cuando creas una instancia del método saludar de MiClase
.Decoradores de clase incorporados en Python
Python también proporciona algunos decoradores de clase incorporados que pueden utilizarse para mejorar las clases de varias formas: 1.@propiedad
: Este decorador indica que un método es un getter para un atributo. Esto te permite definir propiedades de sólo lectura o computadas en tu clase, en lugar de acceder directamente a las variables de instancia. 2. @atributo.setter
: Se utiliza para definir un método setter para una propiedad. Tanto el método getter como el setter deben tener el mismo nombre. Esto controla la modificación de un atributo sin acceder directamente a las variables de instancia. 3. @métodoestático
: Este decorador se utiliza para definir un método estático dentro de una clase. Los métodos estáticos no están vinculados a instancias y no tienen acceso a datos o métodos específicos de la instancia. Se invocan utilizando la propia clase como llamada. 4. @métodoclase
: Se utiliza para definir un método vinculado a la clase y no a la instancia. Toma la propia clase como primer argumento. Esto es útil cuando quieres un método que pueda invocarse en la propia clase y no en sus instancias, lo que suele utilizarse para métodos de fábrica o métodos de configuración. En general, los decoradores de clases proporcionan una forma potente y elegante de mejorar las clases de Python con funcionalidad adicional, impulsando una mejor encapsulación, reutilización del código y modularidad. Te ayudan a escribir un código más limpio, fácil de mantener y eficiente, respetando los principios de diseño de la programación orientada a objetos.Clases en Python - Puntos clave
Clases en Python: Una clase es un plano o plantilla para crear objetos en Python, que te permite definir atributos y métodos que compartirán todas las instancias de la clase.
Clase Objeto en Python: Todas las clases derivan de la clase
objeto
incorporada, lo que facilita la reutilización del código y la coherencia entre todas las clases de Python mediante la herencia.Propiedades en las Clases Python: Las propiedades son atributos con accesores personalizados, como los métodos getter y setter, que permiten controlar el acceso y la modificación de los atributos de la clase.
Método de Clase en Python: Además de los métodos de instancia estándar, las clases de Python pueden tener métodos estáticos y métodos de clase, definidos mediante los decoradores
@staticmethod
y@classmethod
, respectivamente.Decoradores de clase en Python: Los decoradores de clase se utilizan para modificar o mejorar el comportamiento de las clases, permitiendo a los desarrolladores implementar funcionalidades adicionales o reutilizar código de forma limpia y modular.
Aprende más rápido con las 26 tarjetas sobre Clases en Python
Regístrate gratis para acceder a todas nuestras tarjetas.
Preguntas frecuentes sobre Clases en Python
Acerca de StudySmarter
StudySmarter es una compañía de tecnología educativa reconocida a nivel mundial, que ofrece una plataforma de aprendizaje integral diseñada para estudiantes de todas las edades y niveles educativos. Nuestra plataforma proporciona apoyo en el aprendizaje para una amplia gama de asignaturas, incluidas las STEM, Ciencias Sociales e Idiomas, y también ayuda a los estudiantes a dominar con éxito diversos exámenes y pruebas en todo el mundo, como GCSE, A Level, SAT, ACT, Abitur y más. Ofrecemos una extensa biblioteca de materiales de aprendizaje, incluidas tarjetas didácticas interactivas, soluciones completas de libros de texto y explicaciones detalladas. La tecnología avanzada y las herramientas que proporcionamos ayudan a los estudiantes a crear sus propios materiales de aprendizaje. El contenido de StudySmarter no solo es verificado por expertos, sino que también se actualiza regularmente para garantizar su precisión y relevancia.
Aprende más