Plusieurs constructeurs en python, en utilisant l'héritage
J'ai une classe AbstractDataHandle, avec son init méthode, et une classe du Classificateur. Je voudrais avoir deux constructeurs dans Classificateur, Java comme. L'un hérité de sa super-classe, et une nouvelle marque.
Il serait quelque chose comme (mais j'ai l'intention de le "garder" les deux constructeurs):
class AbstractDataHandle():
def __init__(self, elements, attributes, labels):
self._load(elements, attributes, labels)
class Classifier(AbstractDataHandle):
def __init__(self, classifier="LinearSVC", proba=False):
self._fit(classifier, proba)
Puis-je avoir deux constructeurs dans la classe?
Si oui, puis-je avoir un constructeur hérité d'une super-classe, et en ajouter un nouveau?
Vous en remercie d'avance.
vous pourriez avoir de la sous-classe appel du constructeur de la superclasse constructeur via
Merci pour la réponse. Le truc, c'est un appel à super, je n'aurais qu'un seul constructeur. En Java est possible d'avoir plus d'un, si le nombre (et/ou le type d'arguments est différent. Je me demande si la même chose existe en python.
Vous pouvez utiliser
Précisément pourquoi avez-vous besoin de deux constructeurs? Vous pouvez regarder les méthodes de la classe de simuler ce comportement stackoverflow.com/a/141777/735204
super
stackoverflow.com/questions/576169/...Merci pour la réponse. Le truc, c'est un appel à super, je n'aurais qu'un seul constructeur. En Java est possible d'avoir plus d'un, si le nombre (et/ou le type d'arguments est différent. Je me demande si la même chose existe en python.
Vous pouvez utiliser
@classmethod
pour faire comme beaucoup de constructeur comme des méthodes que vous le souhaitez.Précisément pourquoi avez-vous besoin de deux constructeurs? Vous pouvez regarder les méthodes de la classe de simuler ce comportement stackoverflow.com/a/141777/735204
OriginalL'auteur Lucas Ribeiro | 2013-10-10
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas avoir deux constructeurs dans une classe.
Les constructeurs ont à être nommé
__init__
. Et, contrairement à Java, Python ne permet pas la surcharge de fonctions ou de méthodes par le type de leurs arguments. Donc, si vous aviez deux constructeurs, ils seraient tous les deux la même fonction.Il existe quelques façons de contourner cela.
Utilisation
@classmethod
s que les autres constructeurs:Un exemple simple de la bibliothèque standard est
datetime.datetime
, qui peut être construit avec,
fromtimestamp
, ou de quelques autres constructeurs, en plus de la par défaut.Utiliser la valeur par défaut valeur, mot-clé seule, et/ou variable argument paramètres pour en faire un seul constructeur qui peut être appelé de différentes manières:
int
en est un exemple: Vous pouvez créer à partir d'une chaîne et d'une base, ou à partir d'un seul argument qui sait comment convertir un entier.Créer des sous-classes qui ont chacun des constructeurs:
Dans tous ces cas, vous pouvez factoriser les points communs en une seule "base" de l'initialiseur. Par exemple:
Bien sûr, en aucun cas, est-il possible d'avoir le petit déjeuner sans spam.
__init__
est pas le constructeur, c'est (comme son nom l'indique) un initialiseur. Le bon constructeur est__new__
La documentation des appels
__init__
le constructeur à plusieurs reprises (par exemple, ici). Et c'est compatible avec d'autres langues, par exemple, en C++, la méthode avec le même nom que la classe qui prend des valeurs d'initialisation est le constructeur; la méthode qui alloue de stockage et est appelénew
est l'allocateur.Lorsque les documents sont soigneusement de parler, "constructeur" se réfère uniquement à la à la classe de l'objet, qui peut terminer l'appel
__new__
et/ou__init__
, pas à l'une des méthodes. Mais quand ils parlent à la légère, c'est toujours__init__
, pas__new__
, qui a appelé à un constructeur.le doc aussi utiliser le terme "variable" et "cession" au lieu de "nom" et "liaison", qui BTW confond l'enfer de personnes en provenance de la C monde. Aussi
__new__
n'est pas nécessairement "alloue" tout stockage elle peut retourner ce que tu veux de retour, y compris un objet.Vous pouvez argumenter que les docs sont mal rédigé. Mais en disant "
__init__
n'est pas le constructeur... Le bon constructeur est__new__
..." est erroné. Les documents d'appel__init__
et pas__new__
le constructeur, et__init__
est celui qui est parallèle à ce que les constructeurs dans les autres langues; vous ne pouvez pas redéfinir les termes pour signifier quelque chose de différent de ce que tout le monde entend et puis dire: "Selon mon idiosyncrasiques définitions, vous êtes incorrect."OriginalL'auteur abarnert
Vous pouvez utiliser les méthodes de la classe, qui travaillent dans l'usine méthodes. C'est à mon humble avis la meilleure approche pour plusieurs constructeurs. Premier argument 'cls' est la classe elle-même, n'est pas c'est de l'instance, de sorte cls('Camion') dans la classe de la méthode invoque le constructeur de la classe Voiture.
Puis vous appelez la méthode de fabrique de cette façon:
OriginalL'auteur Pawel Bragoszewski
Il y a les méthodes de la accepté de répondre, mais je pense que c'est assez flexible. C'est compliqué, mais très souple.
Lorsque la classe est instiated, init appelle une méthode et lui passer un argument de type chaîne (obtenu à partir de l'instanciation). Cette fonction utilise le conditionnel pour appeler la droite "constructeur" de la fonction pour initialiser vos valeurs, disons que vous avez de différents ensembles de possibles valeurs de départ.
Si vous avez besoin de fournir d'autres arguments (par exemple, qui pourraient avoir une valeur qu'à l'exécution), vous pouvez utiliser les valeurs par défaut dans init() pour permettre à des arguments facultatifs, et d'initialiser ceux init comme vous le feriez normalement.
Dont la sortie est:
OriginalL'auteur Francky_V