896 votes

Python __init__ et self que font-ils ?

Je suis en train d'apprendre le langage de programmation Python, et j'ai rencontré certaines choses que je ne comprends pas entièrement. Je viens d'une formation en C, mais je n'ai jamais été très loin dans ce domaine non plus.

Ce que j'essaie de comprendre c'est :

Dans une méthode :

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

Qu'est-ce que le soi fait ? Qu'est-ce qu'il est censé être ? et est-il obligatoire ?

Que fait le __init__ méthode faire ? pourquoi est-ce nécessaire ? etc

Je pense qu'ils pourraient être des constructions d'Oop, mais je ne sais pas beaucoup

646voto

Chris B. Points 14211

Dans ce code :

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

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

... le 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 l'objet A et appeler ses méthodes, elle sera passée automatiquement, comme dans ...

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

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

13 votes

Et si vous mettiez x = 'Hello' à l'extérieur de init mais à l'intérieur de la classe ? est-ce que c'est comme en java où c'est pareil, ou est-ce que ça devient comme une variable statique qui n'est initialisée qu'une fois ?

18 votes

C'est comme une variable statique. Elle n'est initialisée qu'une seule fois, et elle est disponible par l'intermédiaire de A.x o a.x . Notez que le remplacement de cette fonction par une classe spécifique n'affectera pas la classe de base. A.x = 'foo'; a.x = 'bar'; print a.x; print A.x imprimera bar puis foo

175 votes

Il est utile de préciser que le premier argument ne doit pas nécessairement être appelé self c'est juste par convention.

276voto

RedBlueThing Points 21332

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 ce 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 d'une 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 sont stockés dans des variables sur la pile et sont supprimés lorsque la méthode init sort de sa portée. Si vous définissez ces variables comme self._x, elles deviennent des membres de l'objet Point (accessibles pendant toute la durée de vie de l'objet).

2 votes

Alors, y a-t-il une raison pour laquelle vous ne voudriez pas self doit être dans le constructeur ? Pourquoi faut-il le préciser, ne serait-ce pas mieux si c'était implicite ?

2 votes

Pour autant que je sache, __ init __ n'est pas un constructeur, c'est la première méthode qui sera exécutée lorsqu'un objet est créé, __ init __ est utilisé pour configurer l'objet. __ new __ est le constructeur en python.

0 votes

Pour ceux qui lisent cette réponse, elle est complètement fausse. __init__ n'alloue pas d'espace dans la mémoire. Il est censé initialiser les attributs d'instance. Ce qui est alloué en mémoire est __new__ .

251voto

Dave Everitt Points 3862

Dans l'espoir que cela puisse vous aider un peu, voici un exemple simple que j'ai utilisé pour comprendre la différence entre une variable déclarée à l'intérieur d'une classe, et une variable déclarée à l'intérieur d'une classe. __init__ fonction :

class MyClass(object):
     i = 123
     def __init__(self):
         self.i = 345

a = MyClass()
print a.i
345
print MyClass.i
123

7 votes

Observation intéressante, mais je pense que vous faites fausse route. Avec print MyClass.i, on dirait plutôt que vous appelez une variablie 'statique' i. Alors qu'avec a.i, vous appelez une variable membre, i. Il me semble que init est juste un constructeur qui est exécuté en premier lorsque vous créez un objet de la classe.

45 votes

C'est ce que j'essayais de m'expliquer avec cet exemple, à savoir que la variable définie par l'option __init__ est ce qui est transmis à instances de la classe, et non la variable 'static' de la classe elle-même qui porte le même nom...

49voto

Amit Points 5760

En bref :

  1. self comme il le suggère, fait référence à lui-même - l'objet qui a appelé la méthode. Autrement dit, si vous avez N objets qui appellent la méthode, alors self.a fera référence à une instance distincte de la variable pour chacun des N objets. Imaginez N copies de la variable a pour chaque objet
  2. __init__ est ce que l'on appelle un constructeur dans d'autres langages OOP tels que C++/Java. L'idée de base est qu'il s'agit d'un spécial qui est automatiquement appelée lorsqu'un objet de cette classe est créé.

HTH, Amit

33voto

ewalk Points 810

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

3 votes

"self" définit si une méthode est statique ou non ! Wow, c'est une révélation pour ce gars de Java.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X