Que font __init__ et self en Python ?

J&#8217apprends le langage de programmation Python et je suis tombé sur quelque chose que je ne comprends pas bien.

Dans une méthode comme :

def method(self, blah):
    def __init__(?):
        ....
    ....

Que fait self ? Que doit-il être ? Est-il obligatoire ?

Que fait la méthode __init__ ? Pourquoi est-elle nécessaire ? (etc.)

Je pense que ce sont des constructions OOP, mais je n'en sais pas beaucoup.

Dans ce code :

class A(object):
    def __init__(self):
        self.x = 'Hello'

    def method_a(self, foo):
        print self.x + ' ' + foo

... la variable self représente l'instance de l'objet lui-même. La plupart des langages orientés objet la transmettent comme un paramètre caché aux méthodes définies sur un objet ; Python ne le fait pas. Vous devez la déclarer explicitement. Lorsque vous créez une instance de la classe A et que vous appelez ses méthodes, elle sera automatiquement transmise, comme dans ...

a = A()               # We do not pass any argument to the __init__ method
a.method_a('Sailor!') # We only pass a single argument

La méthode __init__ est en gros ce qui représente un constructeur en Python. Quand vous appelez A(), Python crée un objet pour vous, et le passe comme premier paramètre à la méthode __init__. Tout paramètre supplémentaire (par exemple, A(24, 'Hello')) sera également passé comme argument - dans ce cas, une exception sera levée, puisque le constructeur ne les attend pas.

Commentaires (3)

Oui, vous avez raison, ce sont des constructions oop.

__init__ est le constructeur d'une classe. Le paramètre self fait référence à l'instance de l'objet (comme this en C++).

class Point:
    def __init__(self, x, y):
        self._x = x
        self._y = y

La méthode __init__ est appelée lorsque la mémoire de l'objet est allouée :

x = Point(1,2)

Il est important d'utiliser le paramètre self à l'intérieur de la méthode d'un objet si vous voulez que la valeur persiste avec l'objet. Si, par exemple, vous implémentez la méthode __init__ comme ceci :

class Point:
    def __init__(self, x, y):
        _x = x
        _y = y

Vos paramètres x et y seront stockés dans des variables sur la pile et seront supprimés lorsque la méthode init sortira de sa portée. En définissant ces variables comme self._x et self._y, vous les définissez comme membres de l'objet Point (accessibles pendant toute la durée de vie de l'objet).

Commentaires (1)

__init__ agit comme un constructeur. Vous devrez passer "self" à toutes les fonctions de classe comme premier argument si vous voulez qu'elles se comportent comme des méthodes non-statiques. Les "self" sont des variables d'instance de votre classe.

Commentaires (1)