Clases y Objectos en Python

Avatar Tutor | octubre 28, 2018

Python es un lenguaje de programación orientado a objetos. A diferencia de la programación orientada a procedimientos, donde el énfasis principal está en las funciones, la programación orientada a objetos hace hincapié en los objetos.

El objeto es simplemente una colección de datos(variables) y métodos(funciones) que actúan sobre esos datos. Y, la clase es un plano para el objeto.

Podemos pensar en la clase como un boceto(prototipo) de una casa. Contiene todos los detalles sobre los pisos, puertas, ventanas, etc. Basándonos en estas descripciones, construimos la casa. La casa es el objeto.

Como muchas casas se pueden hacer a partir de una descripción, podemos crear muchos objetos de una clase. Un objeto también se denomina instancia de una clase y el proceso de creación de este objeto se denomina creación de instancias.

Definiendo una clase en Python

Las definiciones de funciones similares comienzan con la palabra clave def, en Python, definimos una clase usando la palabra clave class.

La primera cadena se llama docstring y tiene una breve descripción de la clase. Aunque no es obligatorio, se recomienda.

Aquí hay una definición de clase simple.

class MyNewClass:
    '''Este es un docstring. He creado una clase'''
    pass

Una clase crea un nuevo espacio de nombres local donde se definen todos sus atributos. Los atributos pueden ser datos o funciones.

También hay atributos especiales que comienzan con guiones bajos(__). Por ejemplo, __doc__ nos da la cadena de documentación de esa clase.

Tan pronto como definimos una clase, se crea un nuevo objeto de clase con el mismo nombre. Este objeto de clase nos permite acceder a los diferentes atributos, así como crear una instancia de los nuevos objetos de esa clase.

class MyClass:
	"Esta es una segunda clase"
	a = 10
	def func(self):
		print('Hello')

# Output: 10
print(MyClass.a)

# Output: 
print(MyClass.func)

# Output: 'Esta es una segunda clase'
print(MyClass.__doc__)

Cuando ejecute el programa, la salida será:

10
Esta es una segunda clase

Creando un objeto en Python

Vimos que el objeto de clase podría usarse para acceder a diferentes atributos.

También se puede utilizar para crear nuevas instancias de objeto(creación de instancias) de esa clase. El procedimiento para crear un objeto es similar a una llamada de función.

Esto creará un nuevo objeto de instancia llamado ob. Podemos acceder a los atributos de los objetos utilizando el prefijo de nombre de objeto.

Los atributos pueden ser datos o método. Método de un objeto son funciones correspondientes de esa clase. Cualquier objeto de función que sea un atributo de clase define un método para objetos de esa clase.

Esto quiere decir que, dado que MyClass.func es un objeto de función(atributo de clase), ob.func será un objeto de método.

class MyClass:
	"Esta es una segunda clase"
	a = 10
	def func(self):
		print('Hello')

# create a new MyClass
ob = MyClass()

# Output: 
print(MyClass.func)

# Output: >
print(ob.func)

# Calling function func()
# Output: Hello
ob.func()

Es posible que haya notado el parámetro auto en la definición de la función dentro de la clase, pero llamamos al método simplemente como ob.func() sin ningún argumento. Todavía funcionaba.

Esto se debe a que, siempre que un objeto llama a su método, el objeto en sí se pasa como el primer argumento. Entonces, ob.func() se traduce a MyClass.func(ob).

En general, llamar a un método con una lista de n argumentos equivale a llamar a la función correspondiente con una lista de argumentos que se crea al insertar el objeto del método antes del primer argumento.

Por estas razones, el primer argumento de la función en clase debe ser el objeto en sí. Esto se llama convencionalmente yo. Puede ser nombrado de otra manera, pero recomendamos encarecidamente seguir la convención.

Ahora debe estar familiarizado con el objeto de clase, el objeto de instancia, el objeto de función, el objeto de método y sus diferencias.

Constructores en Python

Las funciones de clase que comienzan con un subrayado doble (__) se denominan funciones especiales porque tienen un significado especial.

De un interés particular es la función __init __ (). Esta función especial se llama cada vez que se crea una instancia de un nuevo objeto de esa clase.

Este tipo de función también se denomina constructores en Programación Orientada a Objetos (OOP). Normalmente lo usamos para inicializar todas las variables.

class ComplexNumber:
    def __init__(self,r = 0,i = 0):
        self.real = r
        self.imag = i

    def getData(self):
        print("{0}+{1}j".format(self.real,self.imag))

# Crea un objecto CompleyNumber
c1 = ComplexNumber(2,3)

# llama la funcion getData()
# Output: 2+3j
c1.getData()

# Crea otro objecto
# con un nuevo atributo 'attr'
c2 = ComplexNumber(5)
c2.attr = 10

# Output: (5, 0, 10)
print((c2.real, c2.imag, c2.attr))

# but c1 object doesn't have attribute 'attr'
# AttributeError: 'ComplexNumber' object has no attribute 'attr'
c1.attr

En el ejemplo anterior, definimos una nueva clase para representar números complejos. Tiene dos funciones, __init __ () para inicializar las variables (por defecto a cero) y getData () para mostrar el número correctamente.

Una cosa interesante a tener en cuenta en el paso anterior es que los atributos de un objeto se pueden crear sobre la marcha. Creamos un nuevo atributo attr para el objeto c2 y lo leemos también. Pero esto no creó ese atributo para el objeto c1.

Eliminar atributos y objetos

Cualquier atributo de un objeto se puede eliminar en cualquier momento, utilizando la declaración del. Intente lo siguiente en el shell de Python para ver la salida.

>>> c1 = ComplexNumber(2,3)
>>> del c1.imag
>>> c1.getData()
Traceback (most recent call last):
...
AttributeError: 'ComplexNumber' object has no attribute 'imag'

>>> del ComplexNumber.getData
>>> c1.getData()
Traceback (most recent call last):
...
AttributeError: 'ComplexNumber' object has no attribute 'getData'

Incluso podemos eliminar el objeto en sí mismo, utilizando la declaración del.

>>> c1 = ComplexNumber(1,3)
>>> del c1
>>> c1
Traceback (most recent call last):
...
NameError: name 'c1' is not defined

Written by Tutor