Curso de introducción a la programación con Python¶

    Autor: Luis Fernando Apáez Álvarez
    -Curso PyM-
    Clase 3: Clases y objetos (Parte III)
    Fecha: 01 de diciembre del 2022


Contenido¶

  • Modificando los atributos de un objeto
    • Nuevos atributos

Modificando los atributos de un objeto ¶

Recordemos de la sesión pasada el código de la clase Persona:

In [1]:
# Creamos la clase Persona 

class Persona():
    
    # Creamos el constructor (método inicializador)
    
    def __init__(self, nombre):
        self.nombre = nombre
        self.ojos = 2
        self.brazos = 2
        self.piernas = 2
        self.nariz = 1
        self.hablando = False
        self.corriendo = False
    
    # Después los siguientes métodos
    
    # agregamos un parámetro
    def hablar(self, msj):
        self.hablando = True
        mensaje = msj
        
        if self.hablando:
            print(mensaje)
    
    def correr(self):
        self.corriendo = True
        
# Creamos un objeto de esta clase
persona1= Persona('Luis')

Ahora bien, sabemos que podemos acceder a los atributos iniciales (dados por el constructor) utilizando la nomenclatura del punto. Por ejemplo

In [2]:
print(f'Hola, soy {persona1.nombre}')
Hola, soy Luis
In [3]:
# accediendo a un atributo de la clase persona

print(persona1.ojos)
2

Luego, de la misma forma en que podemos acceder a los atributos de un objeto podemos modificarlos utilizando también la nomenclatura del punto. Por ejemplo podemos cambiar el atributo nombre del objeto Luis

In [4]:
# modificando el atributo nombre

persona1.nombre = 'Luis Fernando'

# veamos el resultado

print(persona1.nombre)
Luis Fernando
In [5]:
# modificando el atributo corriendo de False a True

persona1.corriendo = True

# veamos el resultado

print(persona1.corriendo)
True

Por otro lado, recordemos que para invocar un método escribiamos

In [6]:
persona1.correr()

print(persona1.corriendo)
True

pero existe una alternativa para ejecutar la misma acción, donde colocaremos primero el nombre de la clase, después el nombre del método y como parámetro de éste el objeto el cual deseamos que invoque dicho método (claro está, utilizando la nomenclatura del punto). Esto es

In [7]:
# nombre de la clase/ nombre del método/ como parámetro el objeto que invoca el método
Persona.correr(persona1)

print(persona1.corriendo)
True

Sin embargo esta última forma no es tan común de emplearse por lo que seguiremos trabajando con la primera manera.

Nuevos atributos ¶

Además de los atributos ya dados en el constructor, podemos agregar nuevos atributos. Por ejemplo, podemos agregar el atributo edad al objeto Luis como sigue

In [8]:
# agregando un atributo nuevo al objeto Luis

persona1.edad = 23

print(f'La edad de {persona1.nombre} es de {persona1.edad} años')
La edad de Luis Fernando es de 23 años

Sin embargo, el atributo nuevo que hemos agregado al objeto Luis no estará disponible para los demás objetos:

In [9]:
# creamos un objeto nuevo de la clase Persona

persona2 = Persona('Eva')

print(persona2.edad)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Input In [9], in <cell line: 5>()
      1 # creamos un objeto nuevo de la clase Persona
      3 persona2 = Persona('Eva')
----> 5 print(persona2.edad)

AttributeError: 'Persona' object has no attribute 'edad'

Finalmente, es preciso mencionar que la modificación de los atributos a los dados originalmente no es una práctica muy deseable en muchos casos. Por ejemplo, si consideramos el atributo self.nariz = 1 y después lo modificamos

In [10]:
persona1.nariz = 4

print(persona1.nariz)
4

sería una acción que no tendría mucho sentido y que no debería de permitirse. Para ello utilizaremos el concepto de encapsulamiento el cual abordaremos en las siguientes sesiones.