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

65voto

Mike Steder Points 4309

En Python :

  • Méthodes d'instance : exiger le self argument.
  • Méthodes de cours : prendre le cours comme premier argument.
  • Méthodes statiques : ne nécessitent ni l'instance ( self ) ou la classe ( cls ).

__init__ est une fonction spéciale et sans surcharge __new__ il recevra toujours l'instance de la classe comme premier argument.

Un exemple utilisant les décorateurs classmethod et staticmethod intégrés :

import sys

class Num:
    max = sys.maxint

    def __init__(self,num):
        self.n = num

    def getn(self):
        return self.n

    @staticmethod
    def getone():
        return 1

    @classmethod
    def getmax(cls):
        return cls.max

myObj = Num(3)
# with the appropriate decorator these should work fine
myObj.getone()
myObj.getmax()
myObj.getn()

Cela dit, j'essaierais d'utiliser @classmethod / @staticmethod avec parcimonie. Si vous vous retrouvez à créer des objets qui ne sont constitués que de staticmethod La chose la plus pythique à faire serait de créer un nouveau module de fonctions connexes.

5voto

Felix Kling Points 247451

Chaque méthode doit accepter un argument : L'instance elle-même (ou la classe s'il s'agit d'une méthode statique).

En savoir plus sur les classes en Python .

4voto

kindall Points 60645

Le fait que votre méthode ne utiliser el self (qui est une référence à l'instance à laquelle la méthode est attachée) ne signifie pas que vous pouvez le laisser de côté. Il doit toujours être présent, car Python essaiera toujours de le faire passer.

2voto

Jordan Points 1646

En python, vous devez toujours passer au moins un argument aux méthodes de classe, l'argument est self et ce n'est pas sans signification : c'est une référence à l'instance elle-même.

2voto

neil Points 1153

L'objet courant est explicitement passé à la méthode comme premier paramètre. self est le nom conventionnel. Vous pouvez l'appeler comme vous le souhaitez, mais il est fortement conseillé de s'en tenir à cette convention pour éviter toute confusion.

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