52 votes

__init__ et arguments en Python

Je veux comprendre les arguments du constructeur __init__ en Python.

class Num:
    def __init__(self,num):
        self.n = num
    def getn(self):
        return self.n
    def getone():
        return 1
myObj = Num(3)

print myObj.getn()

RÉSULTAT : 3

J'appelle le getone() méthode :

print myObj.getone()

RESULTAT : L'erreur 'getone()' ne prend pas d'arguments (1given).

Donc je remplace :

def getone():
    return 1

avec

def getone(self):
    return 1

RESULTAT:1 C'est OK.

Mais getone() ne nécessite aucun argument.

Dois-je utiliser des arguments dénués de sens ?

8 votes

Ils ne sont pas dénués de sens. Chaque méthode d'une classe a toujours un argument implicite, l'instance. En C++, c'est la même chose, mais vous ne la voyez jamais dans la liste des arguments parce qu'elle apparaît comme par magie des buissons de la forêt des fées. Python est Explicit is better than implicit .

2 votes

Vous pouvez utiliser les décorateurs @staticmethod et @classmethod pour faire ce que vous voulez. Veuillez voir l'exemple dans ma réponse.

0 votes

Même si vous nommez la méthode init(self,param) vous pouvez obtenir l'erreur si vous n'indentez pas la def et donc la portée de l'instruction init n'est pas dans la classe ...

1voto

lazos Points 898

Si vous print(type(Num.getone)) vous obtiendrez <class 'function'> .

Il s'agit d'une simple fonction, qui peut être appelée comme d'habitude (sans arguments) :

Num.getone() # returns 1  as expected

mais si vous imprimez print(type(myObj.getone)) vous obtiendrez <class 'method'> .

Donc quand vous appelez getone() d'une instance de la classe, Python "transforme" automatiquement la fonction définie dans une classe en une méthode.

Une méthode d'instance nécessite que le premier argument soit l'objet d'instance. Vous pouvez penser myObj.getone() comme sucre syntaxique pour

Num.getone(myObj) # this explains the Error 'getone()' takes no arguments (1 given).

Par exemple :

class Num:
    def __init__(self,num):
        self.n = num
    def getid(self):
        return id(self)

myObj=Num(3)

Maintenant, si vous

print(id(myObj) == myObj.getid())    
# returns True

Comme vous pouvez le constater self y myObj sont le même objet

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