Aller au contenu

Paramètres et attributs

I. méthode init n'ayant qu'un seul paramètre : self⚓︎

Testons

Le paramètre self

La méthode __init__ ci-dessous n'a qu'un seul paramètre qui est self.

Un objet instance de la classe Joueur a quatre attributs qui sont score, est_actif, nbre_parties_jouees et handicap.

Ces attributs sont tous initialisés : score initialisé à 0, est_actif initialisé à True etc...

Exécuter le script ci-dessous :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Deux instances

Nous avons créé deux instances de la classe Joueur.
On constate qu'à leur création, les attributs des deux objets ont les mêmes valeurs.

II. méthode init ayant plusieurs paramètres :⚓︎

Testons

Nous voulons rajouter l'attribut nom.

Exécuter le script ci-dessous :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

En procédant ainsi, tous les joueurs sont construits avec le même nom. L'attribut nom est initialisé à DUPONT.
On pourra évidemment par la suite modifier cet attribut.

Exécuter le script ci-dessous :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Ce n'est pas pratique ! Nous pouvons ajouter un paramètre qui va permettre d’initialiser l’attribut nom avec une valeur choisie au moment de la création de l’instance.

Testons

Nous voulons rajouter l'attribut nom.

Exécuter le script ci-dessous :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

On peut maintenant construire des joueurs, directement avec leur nom :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Résumé

Dans ce dernier exemple, les objets instances de la classe Joueur ont cinq attributs, le constructeur (la méthode init) a deux paramètres.

Remarque

👉 Très souvent, le nom du paramètre, et le nom de l'attribut auquel il va permettre de transmettre une valeur sont identiques.

On voit souvent des classes rédigées comme ci-dessous. Tester.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

À vous de jouer 1

Compléter la classe Joueur pour qu'elle dispose de l'attribut age. Le constructeur devra avoir un paramètre permettant de transmettre l'âge du joueur.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.1280130ldTy1,4kj/Jeibmc_:35aPr 7=9of.gt286sSh)(punv050d0n0H0w0o0c0L0z0r0c0w0L0L0B010H0o0Q010406050L0R0q0q0w0y0f040M0D0c0R0.0D0S050l0^0`0|0~0?0Q04051e171h0l1e0?0d0o0T0$0(0*0,0N0o0G0N0c1v0N0H0;050X0p0c0n1q0)0+011u1w1y1w0H1E1G1C0H0y1f0H0N0$110L0Q0w0S0,0I011I1s010E0Z0n0S0w0q0n1C1#1%1,1K1/1G1=1@0;0a0z0x0y0D0Q0D0L0o140S0z0V1Z0y0y0n0r2c171`0S1f0l1X2p1U1W1V1D0d1|0,1y0S1;291C1n1p0%1J2z0o2B0S0D2F1C0Q2i1f2n2p2T0@1$2d2H1-2M0y0{0c0;0g2m2X0=2W1{2Z1K2#2%0;0I2+1%2-2n2y012=0w2(040u2_2o0?2|2:0,2 310i342{2X2}3a0;0v3d363f382~0D2$300;0K3k2.2Y1r2;3p2?040A3u373x393z3r040J3D3m3F3o3q310C3d1i2R172F2s0d1W2x3n0r2N1^1f3W1g3U2V182,053$0V2S3M2I010j0;2:3d0z3v3g0r0;0m0D0R0n0R0y0s3j3.2`3 3n0:040t3k060z4k3~3E3^3`040V0E3}4d3N0E0q0;0s0s2K2b4z3S4n1-4f0P4E3@1-0p4f0L0n0c4s4b2o4u3^4f0h4t4F2;0;2M0q4J2/3N4W4Y4K4!040w0G0n4(3w4V0;0O4h4S0=4l4~4m4-0,4M0;4O4Q4?2}0D0;0F573n0S543$2i4,4)3^59040B5i4@1-0q0o0;0b3k4 4l4U4L4N4P4R2V4Z0,5l5b4|5y4.0n0L0H0s0w2k0o5C2,505j1-5l5n4|5U5p1K0j41040e0y455v5w5!2}5304555S4c5E015G5c3N5e040S0p2i0s1$0y0.5L0s0k440n5L5o580;5Y2T5/3n5r5t5-5w5J525A565I5_5{6s512~0;0N1%1n0r0w0Q6d3n5X6F3N6k045u4|4j5.6o015;5?5|5k5a6U2!4#0D4%5Z6Q6H6$5_5~4$6m4 6Q6S5B6X1K6u5D6w5~4:4=6)6w6(6h6Q6`4;3u0l3;0n2p2Q773V1o3X2s2v2q0w1F7a0l3W0?7k0W0Y0!04.

III. Paramètre par défaut⚓︎

Exemple sans paramètre par défaut

Dans l'exemple précédent, les joueurs sont tous initialisés avec un attribut handicap qui vaut 0. En fait, les joueurs qui sont des "champions" ont un handicap de 50. On pourrait procéder ainsi :

class Joueur_5:

    def __init__(self, nom, age):
        self.score = 0
        self.est_actif = True
        self.nbre_parties_jouees = 0
        self.handicap = 0
        self.nom = nom
        self.age = age

Kevin = Joueur_5("DURAND", 18)
Champion_1 = Joueur_5("MAITRE", 30)
Champion_1.handicap = 50
Avec un paramètre par défaut

Il y a une autre possibilité, qui est d'utiliser le paramètre par défaut handicap = 0.

A la construction d'un objet, si le paramètre n'est pas précisé, il prendra pour valeur 0. Sinon, il prendra la valeur donnée.

Tester ci-dessous :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Meilleure pratique

Dans cet exemple, il vaut mieux ne pas donner de valeur par défaut au paramètre handicap

À vous de jouer

Compléter le script ci-dessous :

  • Pas de paramètre par défaut
  • handicap est un paramètre
  • Kevin a pour nom "DURAND", âge 18 ans et ne doit pas avoir de handicap.Champion_1 a pour nom "MAITRE", âge 30 ans, doit avoir un handicap de 50.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013D0ldCTy1,4Akj/JUeibmc_:I35qaPr 7=9of.gt28;6sSRh)(MEpNuKnv050e0r0N0C0s0d0S0F0v0d0C0S0S0H010N0s0!010406050S0$0u0u0C0E0h040T0J0d0$0}0J0(050o1416181a120!04051q1j1t0o1q120e0s0)0=0@0_0{0V0s0M0V0d1H0V0N10050-0t0d0r1C0^0`011G1I1K1I0N1Q1S1O0N0E1r0N0V0=1d0S0!0C0(0{0O011U1E010K0/0r0(0C0u0r1O1;1?1{1W1~1S2123100a0F0D0E0J0!0J0S0s1g0(0F0+1/0E0E0r0v2o1j260(1r0o1-2B1*1,1+1P0e280{1K0(202l1O1z1B0?1V2L0s2N0(0J2R1O0!2u1r2z2B2)131=2p2T1|2Y0E170d100F0i2y2-112,272/1W2;2?2^0O2{1?2}2z2K01320C2@040F0z362A1239300{3c3e0F0k3i382-3a3o2^0A3s3k3u3m3b0J2=3d2^0R3z2~2.1D313E333f0G3J3l3M3n3O3G3f0P3S3B3U3D3F3p0I3!2 3$3w040i0c3+3L2U3%3P0i2`1k2|3A3,3@3.0i353|371u2%1j2R2E0e1,2J3C0v2Z241r491s472+442A054f0+2(3#3@0m10303s0F3K3v0v100p0J0$0r0$0E0w3R4n4s3 1|0 040x3z060F4V4z3T4u100+0K4y4A3C0K0u100w0w2W2n4-3s4(3$4Q0X4=4Y1|0t4Q0S0r0d4$4M4?3@4Q0j4%4{31102Y0u4`4t4P10574M4X5f5a040C0M0r5e4O1W56585l3n100V1?1z0v0C0!5r3?5g040W4S4M4U4W5N544|4~50522+590{0J100L5F3v100S4f2u5v5s5W100H5*5G1W0u0s103;5L5N5O5V014}5$5S5!3C5X045Z535|0(100r0S0N0w0C2w0s5T2|5k5+01635.5j5P1W0m4C040g0E4G3z5`4W6p0{5~044 51613$63655U5w3b5b0t2u0w1=0E0}6a0w0n4F0r6a5/3a6m6!3C5=5@6x6y6j5:6B5R6F666L6I6G405y5A0s5C5E6o5|6$6 6L68045z0(5B5D6+6y6A5}6:6h45705Y6^2:5b0J5d726k712)6-5#045c7a5`7c6C6E7f4o7h647j5m5o5q7o6.6l5-6%3-107H4T7c740%0r0)2W7N3@7q6i7S4D6X4I4K7F0{4^7+010S1_04020B0$0J0N0Q0b0q0U0l0#0b7?7^7`7.5u7J3a6)3/3Z6=6k867r7c895^6K8d100W3=7t0f5z0u0!0s1h0w3{8f7D6n8x737%4G7)4L8j7K7-8c7K7:10827_0Q0Y0l0y0g0U0Z8N848J3a8e7#5|890z8i2|7c8!377s6(5?040A8)7g6L4Q8m5L1j4q0r2B2$8~481A4a2E2H2C0C1R910o49129b0,0.0:04.

Attention

⚠️ Que l'on soit en POO ou pas, les paramètres par défauts doivent toujours se trouver après les autres.
😢 Ecriture fausse : def ma_fonction(para_1 = 0, para_2):
😊 Ecriture juste : def ma_fonction(para_1, para_2 = 0):

IV. Ecueils avec les paramètres par défauts⚓︎

Attention aux paramètres par défaut de type mutable

⚠️⚠️ Il vaut mieux qu'un paramètre par défaut ne soit pas de type mutable. Pour vous en convaincre, voici un exemple qui montre ce qu'il ne faut pas faire.
Le type list de Python est mutable

Echec

Dans cet exemple, l'attribut rencontres est la liste des adversaires rencontrés par le joueur lors des matchs précédents.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Quel est le problème ?

Ce qui ne va pas

😭 On aurait souhaité que Jules.rencontres soit la liste vide ...

Ce qu'il aurait fallu faire

Tester ci-dessous

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Initialiser un paramètre, ou créer un paramètre par défaut ?

Nous venons de voir que ce n'est pas équivalent d'initialiser un paramètre, ou de créer un paramètre par défaut.

Il faut toujours avoir en tête le problème des paramètres de types mutables.

💡 Deux exemples sur le caractère mutable des listes en Python⚓︎

🤔 Un premier exemple

Tester ci-dessous

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

🤔 Un deuxième exemple

Tester ci-dessous

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

En conclusion sur les types mutables

😂 Toujours bien réfléchir lorsqu'on les utilise !

V. Utilisation des paramètres par défaut dans le cas des arbres⚓︎

Avec les arbres

🌴 Lorsque l'on travaille avec des arbres, il est très courant d'utiliser des paramètres par défaut. C'est un cas où leur utilisation est intéressante. Nous le verrons plus précisément lorsque nous les étudierons.

VI. QCM⚓︎

Cocher la bonne réponse

Ce QCM porte sur cet exemple :

class Participant:

    def __init__(self, nom_participant, age_participant, handicap_participant = 0):
        self.score = 0
        self.est_actif = True
        self.nbre_parties_jouees = 0
        self.handicap = nbre_handicap
        self.nom = nom_participant
        self.age = age_participant

  1. on parle d'attribut pour

    • une méthode

    • un objet

  2. La méthode __init__ possède :

    • 4 attributs

    • 4 paramètres

    • 6 attributs

    • 6 paramètres

  3. ada = Participant('Lovelace', 26)
    

    Le nombre d'attributs d'ada est

    • 2

    • 3

    • 4

    • 1

    • 5

    • 6

  4. La méthode __init__ possède :

    • 4 paramètres dont un par défaut

    • 4 paramètres dont un initialisé

    • 3 paramètres dont un par défaut

    • 3 paramètres dont un initialisé

    • 6 paramètres dont un par défaut

    • 6 paramètres dont un initialisé

  5. score est :

    • un attribut par défaut

    • un attribut initialisé

    • un paramètre par défaut

    • un paramètre initialisé

  6. handicap_participant est :

    • un attribut par défaut

    • un attribut initialisé

    • un paramètre par défaut

    • un paramètre initialisé

  7. handicap est :

    • un attribut

    • un paramètre par défaut