Uso de clases y variables para transferir el modelo de OOP a código

Completado

Quiere evaluar la programación orientada a objetos (OOP) mediante la creación del juego "Piedra, papel, tijeras". Para ello, primero debe modelarlo en un formato de OOP.

Será necesario aplicar algunos conceptos fundamentales de OOP, como los de clases, objetos y estado. En esta se unidad se exploran los elementos siguientes:

  • Conceptos importantes de OOP: Para razonar en la OOP, debe comprender algunos conceptos fundamentales, como los de clases, objetos y estado. Debe saber cuál es la diferencia entre ellos y cómo se relacionan entre sí.
  • Variables en OOP: debe saber cómo trabajar con las variables y cómo agregarlas a los objetos.

¿Qué es un objeto?

El concepto de objetos ya se ha mencionado algunas veces como parte del intento de modelar dominios del problema. Un objeto es un actor. Es algo que hace algo dentro de un sistema. Como resultado de realizar una acción, cambia el estado dentro de sí mismo o de otros objetos.

Piense en un objeto en el mundo real. Está en un aparcamiento; ¿qué ve? Es probable que vea muchos coches, de diferentes formas, tamaños y colores. Para describir un coche, puede usar propiedades como la marca, el modelo, el color y el tipo de coche. Si asigna valores a estas propiedades, queda claro rápidamente si habla de un Ferrari rojo, de un Jeep con tracción a las cuatro ruedas, de un Mustang amarillo, y así sucesivamente.

Illustration that shows a car object with the properties type and color.

En otra escena, imagínese una baraja de cartas en Las Vegas. Observa dos cartas diferentes, que son dos objetos. Comprueba que tienen algunas propiedades comunes, en especial el palo. El palo de los objetos puede ser tréboles, corazones, diamantes o picas. Sus valores pueden ser el as, el rey, el nueve, etc.

Sugerencia

Mire a su alrededor. Tome dos objetos similares, como dos libros o dos sillas, y compruebe si puede encontrar las propiedades que mejor los describen y los hacen únicos.

¿Qué es una clase?

Una clase es un tipo de datos que actúa como una definición de plantilla para un tipo de objeto concreto.

Ha aprendido que un sistema de OOP tiene objetos y que estos objetos tienen propiedades. Existe un concepto similar a un objeto: la clase.

Por tanto, ¿qué es una clase? Una clase es un plano técnico de un objeto. Si la clase es el plano técnico de un coche, el objeto es el coche real que se conduce. La clase es lo que se escribe en el código. El objeto es lo que se obtiene al indicar al entorno de tiempo de ejecución que ejecute el código.

A continuación se muestra una tabla de algunos ejemplos de clases y sus objetos resultantes:

Clase Object
Plano técnico de un coche Honda Accord, Jeep Wrangler
Gato El gato Garfield
Descripción de un helado Fresa, chocolate o vainilla

La forma de crear un objeto a partir de una clase es similar a cómo crearía un coche a partir de un plano técnico. Cuando se crea un objeto, el programa solicita recursos al sistema operativo, es decir, memoria, para poder construir el objeto. Por el contrario, cuando se crea un coche a partir de un plano técnico, la fábrica solicita recursos como metal, caucho y vidrio para poder ensamblar el coche.

Illustration showing the resource inputs required to assemble a car from a blueprint.

Creación de una clase

En Python, una clase se crea con la palabra clave class y se le asigna un nombre, como en este ejemplo:

class Car:

Creación de un objeto a partir de una clase

Cuando se crea un objeto a partir de una clase, se dice que se crea una instancia. Lo que hace es pedirle al sistema operativo que, con esta plantilla (la clase) y estos valores iniciales, le proporcione memoria suficiente y cree un objeto. En esencia, crear instancias es sinónimo de crear.

Para crear una instancia de un objeto, se agregan paréntesis al nombre de la clase. Lo que se obtiene es un objeto que se puede asignar a una variable, de la siguiente manera:

car = Car()

car es la variable que contiene la instancia del objeto. El momento de la creación de instancias, o de la creación de objetos, es cuando se llama a Car().

Diferencias entre las variables de la OOP y los programas mediante procedimientos

En la programación mediante procedimientos es habitual tener variables que contengan información y realicen el seguimiento del estado. Puede definir estas variables siempre que las necesite en el archivo. La inicialización de variables típica puede tener este aspecto:

pi = 3.14

En la OOP también hay variables, aunque se adjuntan a los objetos en lugar de definirse por sí mismas. A las variables de un objeto se les hace referencia como atributos. Cuando un atributo se adjunta a un objeto, se usa de una de estas dos maneras:

  • Para describir el objeto: Un ejemplo de la descripción de una variable sería el color de un coche o el número de manchas de un jirafa.
  • Para mantener el estado: una variable se puede usar para describir el estado de un objeto. Un ejemplo de un estado es el piso de un ascensor o si se ejecuta o no.

Agregar atributos a una clase

Saber qué atributos (variables) se deben agregar a la clase forma parte del modelado. Ha aprendido a crear una clase en el código, ¿pero cómo le agrega un atributo? Tendrá que indicarle a la clase qué atributos debe tener en el momento de la construcción, cuando se crea una instancia de un objeto. Hay una función especial a la que se llama en el momento de la creación, denominada constructor.

Constructor

Muchos lenguajes de programación tienen el concepto de constructor, la función especial que solo se invoca al crear por primera vez el objeto. El constructor solo se llamará una vez. En este método, se crean los atributos que debe tener el objeto. Además, se asignan valores iniciales a los atributos creados.

En Python, el constructor tiene el nombre __init__(). También debe pasar un parámetro especial, self, al constructor. El parámetro self hace referencia a la instancia del objeto. Cualquier asignación a esta palabra clave significa que el atributo termina en la instancia del objeto. Si no agrega un atributo a self, en su lugar se tratará como una variable temporal que no existirá una vez que se haya terminado de ejecutar __init__().

Nota:

También se deberá pasar el parámetro self a cualquier método que necesite hacer referencia a cualquier elemento de la instancia del objeto. Este concepto se tratará en la unidad siguiente.

Adición e inicialización de atributos en una clase

Ahora se verá un ejemplo de configuración de atributos en un constructor:

class Elevator:
    def __init__(self, starting_floor):
        self.make = "The elevator company"
        self.floor = starting_floor

# To create the object

elevator = Elevator(1)
print(elevator.make) # "The Elevator company"
print(elevator.floor) # 1

En el ejemplo anterior se describe la clase Elevator con dos variables, make y floor. Una conclusión importante del código es que se llama a __init__() de forma implícita. No se llama al método __init__() por nombre, sino que se llama cuando se crea el objeto, en esta línea de código:

elevator = Elevator(1)

Uso incorrecto de self

Para enfatizar cómo funciona el parámetro self, tenga en cuenta el código siguiente, en el que se asignan dos atributos, color y make, en el constructor __init__():

class Car:
    def __init__():
        self.color = "Red" # ends up on the object
        make = "Mercedes" # becomes a local variable in the constructor

car = Car()
print(car.color) # "Red"
print(car.make) # would result in an error, `make` does not exist on the object

Si el propósito era hacer que los atributos color y make de la clase Car, debe modificar el código. En el constructor, asegúrese de que los dos atributos se asignan a self, de la manera siguiente:

self.color = "Red" # ends up on the object
self.make = "Mercedes"

Sugerencia

Como ejercicio personal, intente crear una clase a partir de un libro. Piense en cómo escribiría su clase y qué propiedades debería tener.