Estoy aprendiendo el lenguaje de programación Python y me he encontrado con algo que no entiendo del todo.
En un método como:
def method(self, blah):
def __init__(?):
....
....
¿Qué hace self
? ¿Qué debe ser? ¿Es obligatorio?
¿Qué hace el método __init__
? ¿Por qué es necesario? (etc.)
Creo que pueden ser construcciones OOP, pero no sé mucho.
En este código:
class A(object):
def __init__(self):
self.x = 'Hello'
def method_a(self, foo):
print self.x + ' ' + foo
... la variable self
representa la instancia del propio objeto. La mayoría de los lenguajes orientados a objetos la pasan como un parámetro oculto a los métodos definidos sobre un objeto; Python no lo hace. Tienes que declararlo explícitamente. Cuando crees una instancia de la clase A
y llames a sus métodos, se pasará automáticamente, como en ...
a = A() # We do not pass any argument to the __init__ method
a.method_a('Sailor!') # We only pass a single argument
El método __init__
es más o menos lo que representa un constructor en Python. Cuando llamas a A()
Python crea un objeto por ti, y lo pasa como primer parámetro al método __init__
. Cualquier parámetro adicional (por ejemplo, A(24, 'Hola')
) también será pasado como argumento--en este caso causando una excepción, ya que el constructor no los espera.
Sí, tienes razón, son construcciones oop.
__init__
es el constructor de una clase. El parámetro self
se refiere a la instancia del objeto (como this
en C++).
class Point:
def __init__(self, x, y):
self._x = x
self._y = y
El método __init__
es llamado cuando la memoria del objeto es asignada:
x = Point(1,2)
Es importante usar el parámetro self
dentro de un método de un objeto si quieres persistir el valor con el objeto. Si, por ejemplo, implementas el método __init__
así:
class Point:
def __init__(self, x, y):
_x = x
_y = y
Tus parámetros x
e y
se almacenarían en variables en la pila y se descartarían cuando el método init saliera del ámbito. Establecer esas variables como self._x
y self._y
establece esas variables como miembros del objeto Point
(accesible durante el tiempo de vida del objeto).
__init__
actúa como un constructor. Tendrás que pasar "self" a cualquier función de la clase como primer argumento si quieres que se comporten como métodos no estáticos. "self" son variables de instancia para tu clase.