Pourquoi les constructeurs sont-ils en effet appelés «constructeurs»?
Le constructeur (nommé __new__) crée et renvoie une nouvelle instance de la classe. La C.__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 nouvelle Cinstance.
Le but de l'initialiseur C.__init__est de définir une initialisation personnalisée de chaque instance Caprès sa création.
Par exemple Python vous permet de faire:
class Test(object):
pass
t = Test()
t.x = 10 # here you're building your object t
print t.x
Mais si vous voulez que chaque instance de Testait un attribut xégal à 10, vous pouvez mettre ce code à l'intérieur __init__:
class Test(object):
def __init__(self):
self.x = 10
t = Test()
print t.x
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' xattribut, tout ce que vous avez à faire est de passer cette valeur comme argument à __init__:
class Test(object):
def __init__(self, x):
self.x = x
t = Test(10)
print t.x
z = Test(20)
print t.x
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 :)
__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é (voirboolpour 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.