IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Python - class: paramètres optionnels et ordres des paramètres du constructeur


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Femme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 36
    Par défaut Python - class: paramètres optionnels et ordres des paramètres du constructeur
    Bonjour,

    Deux questions sur les instances de classes en Python, je suis débutant Python.
    On peut déclarer une classe comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class maClasse:
       var1 = 1
       var2 = 2
       ...
       varN = N
     
    uneClasse = maClasse()
    On peut même créer des méthodes get et set pour chacun des paramètres de la classe.
    Très bien

    Mais comment on fait en Python pour uniquement passer les paramètres qui nous intéresse au constructeur, les autres paramètres ayant la valeur par défaut?
    Est-on obligé de passer TOUS les paramètres ET obligatoirement dans l'ordre???

    P.ex: Supposons une classe livre avec ses champs : titre, auteurs, éditeur, année, traduction.

    N'est-il pas possible de faire qqch comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    livre1 = nvLivre("titre livre1",
                   "auteur du livre1")
    livre2 = nvLivre(auteur="auteur du livre2",
                    titre="titre du livre II")
    livre3 = nvLivre("titre livre3",
                      "auteur livre3",
                       "éditeur livre 3",
                        2020,
                        "Anglais")
    livre4 = nvLivre(titre="IV livre",
                       année=1920)
    Merci.
    RE: https://docs.python.org/3/tutorial/classes.html

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Salut,

    Citation Envoyé par livebe Voir le message
    N'est-il pas possible de faire qqch comme
    C'est possible... mais c'est plutôt une question de paramètres nommés et par défaut qu'on va pouvoir passer à n'importe quelle fonction (la méthode __init__ d'une instance n'échappe pas à la règle).

    Ce qui est décrit dans le chapitre 4 du Python tutorial (que vous mentionnez) et plus particulièrement en 4.7.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par livebe Voir le message
    Est-on obligé de passer TOUS les paramètres ET obligatoirement dans l'ordre???
    Oui et non.
    Tu peux passer les paramètres dans l'ordre que tu veux en les nommant explicitement ; et tu peux omettre les paramètres ayant une valeur par défaut. L'ordre n'est à respecter que si tu utilises les paramètres positionnels. Et si tu mixes les deux (position et nom), tu dois mettre alors les positionnels (dans le bon ordre) avant les nommés (dans l'ordre que tu veux)
    Exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class Livre:
       def __init__(self, titre, auteur, langue="Français", edition=2020): pass

    Tu as le droit d'écrire
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    a=Livre("Croc Blanc", "Jack London", "Français", 2020)			# Tous les paramètres dans l'ordre (valeur par défaut non utilisée)
    b=Livre("Germinal", "Zola", "Français")					# Tous les paramètres obligatoires présents et le paramètre "langue" aussi (donc sans utiliser sa valeur par défaut)
    c=Livre("Les 3 mousquetaires", "Dumas")					# Tous les paramètres obligatoires présents et les paramètres manquants prenant alors leur valeur par défaut
    d=Livre("La fin de l'éternité", "Asimov", edition=1950)			# Tous les paramètres obligatoires présents et le paramètre "edition" explicitement nommé aussi (donc sans utiliser sa valeur par défaut)
    e=Livre(langue="Français", titre="Fondation", auteur="Asimov")		# Tous les paramètres obligatoires présents et le paramètre "langue" aussi (donc sans utiliser sa valeur par défaut). Et tous nommés car pas dans l'ordre attendu

    Tu n'as pas le droit d'écrire
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    a=Livre("Croc Blanc")							# Manque le paramètre "auteur" qui n'a pas de valeur par défaut
    b=Livre("Germinal", "Zola", langue="Français", 2020)			# Un paramètre positionnel placé après un paramètre nommé => Python ne sait pas où le mettre
    c=Livre("Les 3 mousquetaires", "Dumas", 2020, langue="Français")	# Sans nom alors le 3° paramètre est considéré comme étant la langue et ce paramètre est aussi positionné par son nom
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre actif
    Femme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 36
    Par défaut
    Merci, très intéressant cela manque à la documentation sur les constructeurs de classe, une référence au chapitre 4.7 du Python tutorial
    Mais j'ai pas encore tout saisi
    REF: https://docs.python.org/fr/3.6/tutor...word-arguments

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class intervenant:
        def __init__(self,
                    budget=3000,
                    virtualD=0
                    ): pass
     
    pers1 = intervenant(budget=500)
     
    print(pers1.budget)
    Pourquoi j'ai l'erreur d'exécution:
    AttributeError: 'intervenant' object has no attribute 'budget'
    J'ai bien un constructeur avec "key words arguments"
    J'ai aussi essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class intervenant:
        def __init__(self,
                    *,
                    budget=3000,
                    virtualD=0
                    ): pass
     
    pers1 = intervenant(budget=500)
     
    print(pers1.budget)
    Merci

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Citation Envoyé par livebe Voir le message
    Pourquoi j'ai l'erreur d'exécution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AttributeError: 'intervenant' object has no attribute 'budget'
    Parce que vous avez zappé ce qu'on a essayé de vous expliquer au chapitre 3.1:
    Si une variable n’est pas « définie » (si aucune valeur ne lui a été affectée), son utilisation produit une erreur
    .

    Et passer des paramètres à une fonction, s'il elle n'en fait rien ("pass"), ben, pas de définition des attributs non plus.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre actif
    Femme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 36
    Par défaut
    Je ne vois pas pq, je dois utiliser self

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class intervenant:
        def __init__(self,
                     budget=3000,
                     virtualD=0
                     ):
            self.budget = budget
            self.virtualD = virtualD
     
    pers1 = intervenant(budget=500)
    On sait pas écrire plus léger????
    Je souhaite définir un ensemble d'attributs pour ma classe, ayant chacun une valeur par défaut.
    A la construction, je veux garder la flexibilité de ne pas imposer tous les paramètres au constructeur, seulement ceux connus au moment de l'instanciation.

    Merci

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Salut,

    Citation Envoyé par livebe Voir le message
    On sait pas écrire plus léger????
    Éventuellement, vous pourriez écrire une metaclass qui fasse le boulot sans qu'on ait à écrire explicitement le code dans __init__.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par livebe Voir le message
    cela manque à la documentation sur les constructeurs de classe, une référence au chapitre 4.7 du Python tutorial
    C'est expliqué au chapitre des fonctions et de leurs paramètres. Parce qu'une méthode de classe en général, et donc le constructeur __init__ en particulier, ça reste quand-même d'abord une fonction.
    Donc tu aurais lu ce chapitre tu en aurais déduit que c'était la même chose.

    Citation Envoyé par livebe Voir le message
    Je ne vois pas pq, je dois utiliser self

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class intervenant:
        def __init__(self,
                     budget=3000,
                     virtualD=0
                     ):
            self.budget = budget
            self.virtualD = virtualD
     
    pers1 = intervenant(budget=500)
    On sait pas écrire plus léger????
    T'es gonflé quand-même. Python offre une syntaxe des plus légères et concises permettant des actions des plus complexes !!! T'as qu'à aller faire de l'assembleur si tu trouves Python trop lourd.
    Ca permet de faire la part des choses entre attributs de classes et variables de travail. Ca te plairait que toutes les variables que tu crées dans un constructeur deviennent des attributs ? Tu imagines comme le résultat serait monstrueux question RAM ? Parce que toi t'es là avec ton constructeur à 2 balles avec ses 2 pauvres attributs qui se courrent après tu crois que tous les constructeurs qu'on développe dans toutes les librairies sont tous aussi légers ?
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Utiliser des paramètres optionnels pour retourner des variables au code appelant
    Par GastonLagaffe25 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 22/08/2016, 14h31
  2. [2008R2] Ordre des paramètres
    Par bigdata2015 dans le forum SSRS
    Réponses: 1
    Dernier message: 22/09/2015, 07h53
  3. [CR 2008] Crystal Reports : Ordre des paramètres
    Par Colau72 dans le forum Débuter
    Réponses: 5
    Dernier message: 30/04/2013, 16h27
  4. Réponses: 1
    Dernier message: 24/11/2009, 15h12
  5. Classes paramétrées en Python
    Par Zavonen dans le forum Général Python
    Réponses: 13
    Dernier message: 24/04/2009, 19h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo