El método __init__ y self - Programación orientada a objetos en Python - Capítulo 3


Empezamos a abordar un tema fundamental en la programación orientada a objetos de Python, el método constructor __init__ y una pequeña explicación sobre self.

El método __init__

El famoso método constructor __init__ que tantos quebraderos de cabeza trae, es más fácil de entender de lo que pueda parecer.
Lo más importante es que sirve para inicializar valores de ciertas variables, es decir, de los atributos. por lo que de este modo, siempre tendrás una serie de valores asignados por defecto al instanciar un objeto.

Bien, partimos de la clase que cree para el capítulo anterior, la del ninja principal y creamos un objeto para un tipo de enemigo a partir de la misma clase que el ninja principal.

Código

# Se crea la clase.
class NinjaPrincipal:
	HP = 100
	resistencia = 50
	XP = 1

	def game_over(self):
		print('Game over')

# Se crea el objeto ninja a partir de la clase.
ninja = NinjaPrincipal()

# Se crea el objeto ninja_enemigo a partir de la clase NinjaPrincipal.
ninja_enemigo = NinjaPrincipal()

# Se le asigna un valor diferente del valor por defecto al atributo HP.
ninja_enemigo.HP = 25
print(ninja_enemigo.HP)

Creo el objeto del enemigo y si pruebo de llamar a su atributo de vida (HP), veo que está asignada correctamente:

Resultado

25

Si al atributo HP de este objeto no le indico un valor, tomará el valor inicial que le da el __init__ de la clase, 100.
Lo mismo puedes hacer con los demás atributos.

Esta forma de asignar valores a los objetos puede parecerte una forma correcta de hacerlo, por supuesto, Python lo admite, pero podemos aprovechar el método constructor __init__ para escribir muchísimo menos código, que para eso está y cuando veas su utilidad, ya no vas a preguntarte más si utilizarlo o no.

He modificado un poco la clase. Le he añadido el atributo vidas y he añadido una serie de self. Además, los valores por defecto ya no están asignados igual. Además, he cambiado el nombre de la clase de NinjaPrincipal a Ninjas, ya que va a crear más ninjas como los enemigos en lugar de solo el protagonista.

Código

class Ninjas:
	def __init__(self, hp, resistencia, xp, vidas):
 		self.hp = hp
		self.resistencia = resistencia
		self.xp = xp
		self.vidas = vidas
	def game_over(self):
		print('Game over')

Bien, lo primero que evita esta forma de escribir las clases con el método __init__ es que vamos a evitar escribir cada vez las lineas de asignación de nuevos valores, como estos:

Código

ninja_enemigo = Ninjas()
ninja_enemigo.HP = 25
ninja_enemigo.resistencia = 10
ninja_enemigo.vidas = 1
print(ninja_enemigo.HP, ninja_enemigo.resistencia, ninja_enemigo.vidas)

Si los escribes para un objeto, tampoco es tanto, ¿Y si son 500 objetos con 50 atributos?
Gracias al __init__ evitarás este problema.

Te explico lo que son estos self.

¿Qué es self en Python?

El self hace referencia al nombre del objeto en el que se encuentra escrito. Lo podrías reemplazar por el nombre de la clase, por ejemplo Ninjas.hp = hp.
Si no lo acabas de entender te recomiendo que veas el vídeo, donde lo explico de forma más detallada.

Voy a crear un objeto. Ahora, con esta sintaxis se hace así. En ella, me va a pedir obligatoriamente los cuatro parámetros especificados en el __init__. Si le pones tres te dará error, si le pones cinco también. Así que ya sabes, ni uno más ni uno menos.

Código

ninja_principal = Ninjas(100, 50, 1, 3)

Mucho más fácil, ¿verdad?
En una sola línea he creado el objeto y le he dado todos los valores.

¿Pero qué pasa si quiero añadirle a un objeto un nuevo parámetro?

Podría modificar la clase y añadir el nuevo atributo ahí, si quiero que afecte a todos los objetos instanciados de la clase, o bien, si es solo para un objeto en concreto, se lo puedo añadir solo a ese objeto.

Esto se hace igual que lo hacíamos antes sin el __init__:

Código

ninja_principal = Ninjas(100, 50, 1, 3)
ninja_principal.salto = True

De esta forma, solo tiene el atributo salto el objeto ninja_principal, los otros objetos no lo tienen, al menos por defecto.


Suscríbete a mi canal de YouTube para apoyarme

Si te ha gustado este curso y crees que el trabajo merece la pena, te agradeceré eternamente que te suscribas a mi canal de YouTube para apoyarme y que pueda seguir haciendo cursos gratuitos.

Además, si te encanta la programación, tienes un montón más de cursos gratuitos para ver.

No solo eso, podrás participar enviándome comentarios con tus sugerencias para temas específicos o cursos completos o incluso las dudas que tengas y las intentaré ir resolviendo en los cursos que estén todavía abiertos.


Comentarios

Si te quedan dudas sobre el temario, sobre Python, o cualquier otra cosa relacionada o simplemente quieres agradecer, aquí tienes tu sitio para dejar tu granito de arena. Gracias por tus comentarios y por darle vida a este sitio web.