Pourquoi les constructeurs sont-ils en effet appelés «constructeurs»? Quel est leur objectif et en quoi sont-ils différents des méthodes d'une classe?
Aussi, peut-il y en avoir plus d'un __init__
dans une classe? J'ai essayé ce qui suit, quelqu'un peut-il expliquer le résultat?
>>> class test:
def __init__(self):
print "init 1"
def __init__(self):
print "init 2"
>>> s=test()
init 2
Enfin, est __init__
un surchargeur d'opérateur?
__init__
c'est un initialiseur . Le constructeur python est__new__
. Python utilise l'initialisation automatique en deux phases -__new__
retourne un objet valide mais (généralement) non peuplé (voirbool
pour un contre-exemple), qui l'a ensuite__init__
appelé automatiquement. Cela évite les problèmes que les langages comme C ++ ont avec des objets partiellement construits - vous n'en avez jamais en Python (bien qu'il puisse être partiellement initialisé). Vous n'aurez presque jamais besoin de remplacer les deux__new__
et__init__
sur une classe.Réponses:
Il n'y a pas de surcharge de fonctions en Python, ce qui signifie que vous ne pouvez pas avoir plusieurs fonctions avec le même nom mais des arguments différents.
Dans votre exemple de code, vous ne surchargez pas
__init__()
. Ce qui se passe, c'est que la deuxième définition lie le nom__init__
à la nouvelle méthode, rendant la première méthode inaccessible.Quant à votre question générale sur les constructeurs, Wikipedia est un bon point de départ. Pour les éléments spécifiques à Python, je recommande vivement la documentation Python .
la source
__init__
sera ce qui se terminera dans la classe.Pourquoi les constructeurs sont-ils en effet appelés «constructeurs»?
Le constructeur (nommé
__new__
) crée et renvoie une nouvelle instance de la classe. LaC.__new__
méthode de classe est donc le constructeur de la classe C.La
C.__init__
méthode d'instance est appelée sur une instance spécifique, après sa création, pour l'initialiser avant d'être renvoyée à l'appelant. Cette méthode est donc l' initialiseur pour les nouvelles instances de C.En quoi sont-elles différentes des méthodes d'une classe?
Comme indiqué dans la documentation officielle, il
__init__
est appelé après la création de l'instance . Les autres méthodes ne reçoivent pas ce traitement.Quel est leur but?
L'objectif du constructeur
C.__new__
est de définir un comportement personnalisé lors de la construction d'une nouvelleC
instance.Le but de l'initialiseur
C.__init__
est de définir une initialisation personnalisée de chaque instanceC
après sa création.Par exemple Python vous permet de faire:
Mais si vous voulez que chaque instance de
Test
ait un attributx
égal à 10, vous pouvez mettre ce code à l'intérieur__init__
:Chaque méthode d'instance (une méthode appelée sur une instance spécifique d'une classe) reçoit l'instance comme premier argument. Cet argument est nommé de manière conventionnelle
self
.Les méthodes de classe, telles que le constructeur
__new__
, reçoivent à la place la classe comme premier argument.Maintenant, si vous voulez des valeurs personnalisées pour l'
x
attribut, tout ce que vous avez à faire est de passer cette valeur comme argument à__init__
:J'espère que cela vous aidera à dissiper certains doutes, et puisque vous avez déjà reçu de bonnes réponses aux autres questions, je m'arrêterai ici :)
la source
Les classes sont simplement des plans à partir desquels créer des objets. Le constructeur est un code qui est exécuté chaque fois que vous créez un objet. Pour cela, il n'est pas logique d'avoir deux constructeurs. Ce qui se passe, c'est que le second écrase le premier.
Ce que vous utilisez généralement pour créer des variables pour cet objet comme ceci:
Vous pouvez donc créer un objet à partir de cette classe comme ceci:
Le testobject aura alors un objet appelé
some_value
qui dans cet exemple sera 5.Mais vous n'avez pas besoin de définir une valeur pour chaque objet comme je l'ai fait dans mon exemple. Vous pouvez également faire comme ceci:
alors la valeur de some_value sera 5 et vous n'avez pas à le définir lorsque vous créez l'objet.
le >>> et ... dans mon échantillon n'est pas ce que vous écrivez. C'est à quoi ça ressemblerait dans Pyshell ...
la source
les co-constructeurs sont appelés automatiquement lorsque vous créez un nouvel objet, "construisant" ainsi l'objet. La raison pour laquelle vous pouvez avoir plus d'un init est que les noms ne sont que des références en python et que vous êtes autorisé à modifier ce à quoi chaque variable fait référence quand vous le souhaitez (d'où le typage dynamique)
dans la définition de votre classe, il garde juste la dernière
la source
Il n'y a pas de notion de surcharge de méthode en Python. Mais vous pouvez obtenir un effet similaire en spécifiant des arguments optionnels et des mots-clés
la source