web-dev-qa-db-fra.com

__init__ et arguments dans 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 la méthode getone():

print myObj.getone()

RÉSULTAT: l'erreur "getone ()" ne prend aucun argument (1given).

Je remplace donc:

def getone():
    return 1

avec

def getone(self):
    return 1

RÉSULTAT: 1 C'est OK.

Mais la méthode getone() n'a pas besoin d'arguments.

Dois-je utiliser un argument dénué de sens?

32
Yugo Kamo

En Python:

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

__init__ est une fonction spéciale et sans surcharger __new__ on lui donnera toujours l'instance de la classe comme premier argument.

Un exemple utilisant les décorateurs de méthode de classe et de méthode statique 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 trouvez à créer des objets qui ne sont rien d'autre que staticmethods, la chose la plus à faire en Pythonic serait de créer un nouveau module de fonctions connexes.

43
stderr

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 .

6
Felix Kling

Le fait que votre méthode ne tilise l'argument self (qui est une référence à l'instance à laquelle la méthode est attachée) ne signifie pas que vous pouvez la laisser de côté. Il doit toujours être là, car Python va toujours essayer de le transmettre.

4
kindall

Dans python vous devez toujours passer au moins un argument aux méthodes de classe, l'argument est self et ce n'est pas dénué de sens c'est une référence à l'instance elle-même

2
Jordan

L'objet actuel est explicitement transmis à la méthode comme premier paramètre. self est le nom conventionnel. Vous pouvez l'appeler comme vous voulez, mais il est fortement conseillé de respecter cette convention pour éviter toute confusion.

2
neil