Curso de POO en Python desde cero

¿Qué es el método __init__ de Python?

Capítulo 3: El método __init__ y self - POO Python

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 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 __init__ sirve para inicializar valores de ciertas variables, es decir, los 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 creé 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.

# 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). Podemos comprobar que está asignada correctamente:

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. Para eso está. 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. También, he cambiado el nombre de la clase NinjaPrincipal a Ninjas, ya que va a crear más ninjas como los enemigos en lugar de solo el protagonista.

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:

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 quinientos objetos con cincuenta atributos?
Gracias al __init__evitarás este problema.

Te explico lo que son estos self.

¿Qué es self en Python?

El selfde Python 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.

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__:

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.

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.

Programación Fácil YouTube

Suscríbete

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.