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

27voto

Jayzcode Points 366

Essayez ce code. J'espère que cela aidera de nombreux programmeurs C comme moi à apprendre le Py.

#! /usr/bin/python

class Person:

    '''Doc - Inside Class '''

    def __init__(self, name):
        '''Doc - __init__ Constructor'''
        self.n_name = name        

    def show(self, n1, n2):
        '''Doc - Inside Show'''
        print self.n_name
        print 'Sum = ', (n1 + n2)

    def __del__(self):
        print 'deleting object Destructor', self.n_name

p=Person('Jay')
p.show(2, 3)
print p.__doc__
print p.__init__.__doc__
print p.show.__doc__

0 votes

Je ne sais pas si c'est juste moi, mais la lecture de ce code était un peu confuse. Peut-être que c'est parce que je suis encore un programmeur Python novice, idk.

0 votes

Je ne suis pas sûr de la doc Et si je fais : '''test - mon document''', puis-je utiliser : print.p.__test__ ? ou doc est-il un mot clé spécifique ?

0 votes

Thomas doc est le mot clé pour les détails documentés. Les guillemets sont utilisés pour écrire des documents et le document est une entité facultative.

24voto

eee Points 21

J'ai eu du mal à comprendre moi-même. Même après avoir lu les réponses ici.

Pour bien comprendre le __init__ méthode que vous devez comprendre vous-même.

Le paramètre du moi

Les arguments acceptés par le __init__ méthode sont :

def __init__(self, arg1, arg2):

Mais nous ne lui passons en fait que deux arguments :

instance = OurClass('arg1', 'arg2')

D'où vient l'argument supplémentaire ?

Lorsque nous accédons aux attributs d'un objet, nous le faisons par nom (ou par référence). Ici, l'instance est une référence à notre nouvel objet. Nous accédons à la méthode printargs de l'objet instance en utilisant instance.printargs.

Afin d'accéder aux attributs des objets à partir de l'interface __init__ nous avons besoin d'une référence à l'objet.

Lorsqu'une méthode est appelée, une référence à l'objet principal est passée comme premier argument. Par convention, vous appelez toujours ce premier argument à vos méthodes self.

Cela signifie que dans le __init__ méthode que nous pouvons faire :

self.arg1 = arg1
self.arg2 = arg2

Ici, nous définissons les attributs de l'objet. Vous pouvez le vérifier en effectuant les opérations suivantes :

instance = OurClass('arg1', 'arg2')
print instance.arg1
arg1

Les valeurs de ce type sont appelées attributs d'objet. Ici, le __init__ définit les attributs arg1 et arg2 de l'instance.

source : http://www.voidspace.org.uk/python/articles/OOP.shtml#the-init-method

19voto

IfLoop Points 59461

Notez que self peut en fait être n'importe quel identifiant python valide. Par exemple, nous pourrions tout aussi bien écrire, à partir de l'exemple de Chris B :

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

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

et cela fonctionnerait exactement de la même manière. Il est cependant recommandé d'utiliser self car les autres pythoneux le reconnaîtront plus facilement.

1 votes

Je suis d'accord que self serait recommandé à la place de foo, cela aide les autres programmeurs à regarder le code.

16voto

user1675111 Points 237

Fondamentalement, vous devez utiliser le mot-clé "self" lorsque vous utilisez une variable dans plusieurs fonctions au sein d'une même classe. Comme pour init Elle est utilisée pour définir des valeurs par défaut au cas où aucune autre fonction de cette classe ne serait appelée.

6 votes

Le mot clé "self" n'existe pas en Python. Appeler le premier paramètre 'self' est simplement une convention.

0 votes

Le self est utilisé comme un substitut. Il n'est pas nécessaire d'utiliser self, vous pouvez utiliser "eeee" ou "foo" ou autre chose, c'est simplement recommandé pour les autres programmeurs qui lisent votre code.

14voto

tarn Points 1615

Le "self" est une référence à l'instance de la classe.

class foo:
    def bar(self):
            print "hi"

Maintenant nous pouvons créer une instance de foo et appeler la méthode sur elle, le paramètre self est ajouté par Python dans ce cas :

f = foo()
f.bar()

Mais il peut être passé aussi si l'appel de la méthode n'est pas dans le contexte d'une instance de la classe, le code ci-dessous fait la même chose

f = foo()
foo.bar(f)

Il est intéressant de noter que le nom de la variable 'self' n'est qu'une convention. La définition ci-dessous fonctionnera exactement de la même manière Cela dit, c'est convention très forte qu'il convient de suivre toujours mais cela en dit long sur la nature flexible de la langue.

class foo:
    def bar(s):
            print "hi"

0 votes

Pourquoi cela dit-il quoi que ce soit sur la nature flexible du langage ? Cela dit simplement que vous pouvez donner aux variables le nom légal de votre choix. En quoi est-ce différent de n'importe quel autre langage de programmation ?

0 votes

Comme je l'ai écrit dans ma réponse, "bar" est juste une fonction où une instance de classe est fournie comme premier paramètre. Ainsi, bien que "bar" soit définie comme une méthode liée à "foo", elle peut également être appelée avec une instance d'une autre classe. Ce n'est pas ainsi que les méthodes et les "this" fonctionnent en Java par exemple, même si j'imagine que vous voyez qu'il s'agit du même concept, des fonctions et un certain contexte d'instance (le contexte d'instance étant le premier paramètre en Python et "this" en Java). Peut-être pouvez-vous maintenant voir la flexibilité du langage auquel je faisais référence ?

0 votes

Oui, cela montre la flexibilité de la langue. De la façon dont vous avez formulé votre réponse, on aurait dit que vous disiez que le fait que vous puissiez appeler la variable "self" par un autre nom (par exemple s ) montrait la flexibilité de python.

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