Train en POO

On souhaite dans cet exercice créer une classe Train permettant de relier des objets de type Wagon.

Un objet de type Wagon possède deux attributs :

  • un contenu contenu de type str,
  • un lien vers le wagon suivant suivant de type Wagon.

On inclut aussi deux méthodes permettant d'afficher le wagon dans la console ou sous forme d'une chaine de caractère.

La classe Wagon (pour information)
🐍 Script Python
class Wagon:
    def __init__(self, contenu):
        "Constructeur"
        self.contenu = contenu
        self.suivant = None

    def __repr__(self):
        "Affichage dans la console"
        return f'Wagon de {self.contenu}'

    def __str__(self):
        "Conversion en string"
        return self.__repr__()

Cette classe est déjà "importée" dans la zone de saisie ci-dessous. Il est inutile de la recopier.

Un objet de la classe Train possède deux attributs :

  • premier contient son premier wagon (de type Wagon) ou None si le train est vide (il n'y a que la locomotive),
  • nb_wagons (de type int) contient le nombre de wagons attachés à la locomotive.

Lors de sa création, un objet de type Train sera toujours vide.

Les méthodes de la classe Train sont présentées ci-dessous (train est un objet de type Train) :

  • train.est_vide() renvoie True si train est vide (ne comporte aucun wagon), False sinon ;
  • train.donne_nb_wagons() renvoie le nombre de wagons de train ;
  • train.transporte_du(contenu) détermine si train transporte du contenu (une chaine de caractères). Renvoie True si c'est le cas, False sinon ;
  • train.ajoute_wagon(wagon) ajoute un wagon à la fin du train. On passe en argument le wagon à ajouter ;
  • train.supprime_wagon_de(contenu) prend en argument une chaine de caractères contenu et supprime le premier wagon de contenu du train. Si le train est vide ou ne comporte aucun wagon de contenu, la méthode renvoie False. S'il en contient un et que celui-ci est effectivement supprimé, la méthode renvoie True.

On inclut là-aussi aussi deux méthodes permettant d'afficher le train dans la console ou sous forme d'une chaine de caractères.

Exemples
  • Création d'un train vide :
🐍 Console Python
>>> train = Train()
  • Ajout de wagons :
🐍 Console Python
>>> w1 = Wagon('blé')
>>> train.ajoute_wagon(w1)
>>> w2 = Wagon('riz')
>>> train.ajoute_wagon(w2)
>>> train.ajoute_wagon(Wagon('sable'))
>>> train
'Locomotive - Wagon de blé - Wagon de riz - Wagon de sable'
  • Description du train :
🐍 Console Python
>>> train.est_vide()
False
>>> train.donne_nb_wagons()
3
>>> train.transporte_du('blé')
True
>>> train.transporte_du('matériel')
False
  • Suppression de wagon
🐍 Console Python
>>> train.supprime_wagon_de('riz')
True
>>> train
'Locomotive - Wagon de blé - Wagon de sable'
>>> train.supprime_wagon_de('riz')
False

On pourra parcourir tous les wagons du train en utilisant les instructions ci-dessous :

🐍 Script Python
wagon = self.premier
while wagon is not None:
    # actions à effectuer
    wagon = wagon.suivant

En plusieurs occasions il faudra prendre soin de traiter séparément le cas du premier wagon et celui des suivants.

Enfin, lors de la suppression d'un wagon, on se contentera de l'omettre en liant son wagon précédent à son suivant. La figure ci-dessous illustre ainsi l'instruction train.supprime_wagon_de('riz') avant et après la suppression.

Suppression

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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 : 10/10
.128013:Lp%(40ed3;N 1jE}o5_An)h]6,qc[y!CFuvà8i2+DmWs7=wlSatf-9O{Rrg.TéPkbè/050j0i0!0Z0N0X0T0n0D0X0Z0T0T0V010!0N0d010406050T0J0R0R0Z0+0F040Y0s0X0J180s0w0n020Z0R0d0l0n0*0i1i0+0C0J0i0T050@1f1h1j1l1d0d041J1Q051T0@1T1V1Q1d0j0N0K101214160y0N0,0y0X1-0y0!1b050{0=0X0i1(1315011,1.1:1.0!1_1{1@0!0=0s0j1l1^0+1R0!0y101o0T0d0Z0w160O011}1*010#0}0i0w1w0i1@2l2n2s1 2v1{2y0R2A040a0n0:0+0s0d0s0T0N1r1t0_2j0+0+0i0D2V1J2C0w1R0@2h2+0!2f2e2g0j2E161:0w2x2S1@1#1%111~2^0N2`0w2b1$1@0d2!1R2)2+3c1e2m1t302t350+1i0X1b0n0o2(3g1c3f2D3i1 3k3m3o0O3r2n3t2)2@013y0Z3n040n0k3C2*1d3F3w163I3K0n0g3O3E3g3G3U3o0t3Y3Q3!3S3H0s3l3J3o0A3)3u3h1)3x3.3z3L0U3?3R3_3T3{3:3L0M3 3+413-3/3V0%473v493$040o0h4e3^314a3|0o3q1K3s3*4f4n4h0o3B4s3D4u4m3j433K0o3N4A3P3@3#4F1b0o3X4J3Z4v4E4b4O3(4R4C4M4V4i3=4Y4L3,4x3~4(404w4N4i464-484/4#0o4d4?4T3`4#0O4k4|4D4~3|0O4r3c4Z4*4:0O4z584)4g5b4I5e4.4U554Q5j4@5l440O4X5o4}424 4%5u535w554,5z4!554=5E5a4 4{5I5g4#0k515M4^3|0k574t5f5S440k5d5W5k545Z5i5$5p5(3K0k5n5+5v4o5Z5t5;5A5?5.5y5_5F5Z5D5~5J5T5H625N5T5L665Y3K0g5Q6a5q6c5V4B5X6g1b0g5#6j5%5B440g5*6p5,6r6c5:6v5=4h0g5^6A5`6C5}6F5 6c616J636s656N676s696R6b1b0t6e6V6l040t6i4K6q5{6X6o6)6w6+6$6u6.6B4:0t6z6?6G6^6E6{6K6X6I6 6O3K0t6M736S756Q786W6$6U7c6#0A6Z7g5-1b0A6(4S6|4#0A6-7p70040A6=7u747m6`7z797m6~7D7d0A727H7h777L7l7w7b7O6x7m7f7S6:0U7j7W4h0U7o597E040U7t7(7d0U7y7-6#0U7C7;7P0U7G7^7T7*7K7|7X7N807#7R834:0U7V864#0M7Z8a3|0M7%6k7P0M7,8i7}0M7:8m6:0M7@8q4h0M7{8u4:0M7 8y8b828C8f7R1S3a1J2~2.0j2=3G0D2b2K0^1$1R390i3b3s3Y058Q0_8Y5=0;1b3w8!6*0W3o8-6/0w0D1b0S0Z0,1s8;5=1a040b3)0n930n8q8*040_0#8}5`8/3L9b3G0#0R1b0u0u332U9k9f3,8 0f9p490=8 0T0i0X9a4R8q8 0B3Y956*0w8+1s0!2x0J9t4n8 0x914Y949U9G6/0T2q04010H1s0T2/0J2$0i0J0+01929V938q9v1b9x9z9O2t0s1b0-9{3x9J0w9L0w9N4R9W5=9}040V9F8ua2a4a6589;9=6*9@049_9A3e6*aa9 9B9H9^0J1$2n0!adar1baca7968@040m1s0i3)069U961b99a0169d95au6/9h9j0u2!399oaW8~1b9sa(5`amaoaS019Q9Saiaj8q9Y1b010v0#2v0D0y8`1|0j2n0 122j0w0T1o2A9:9;aP042!0!9-0waB9X0Z1bap8Z6*a`9!8_8{2W1|a:2T1b0)a:a.9ybp3D8qasa:9I048Qa39Mby0N1b0rby9Z9/4YaN94bfaRa,3GaUa:aY049k9(0+a%aq6/9rbC9wbEa:a=bd9Va_bU9$0w0K0i0+2T1s0n2x0nb,330,bVa@be6*97bhbjbl5=bD9`b#3,bIcm49b)9ka#b-0ub^a*0xaM80978,cp4nb%cD3jaH0.0+0|bkcG1 8 a?4taOceaQ0ibF2*8qcFb/5=cr9l0w9ncvcN16b;c+01ckcW8(5`b_9Ta^brb}9%9)9+9-cbcRc_6/c:a:coc!6G1b8W0R0Nc1ci5`aaaE3ca85`0;aHaJ2`b`cSd3b?cld73Gd6bq8=1b0w0=0u0W8`9%dedvaDdG3,db1b8dbXak6/97b!du3,cZdx6B0#1b1H0!0u0K0N0_cw04a+dT9udsc;9C1b9R4lb$3oa^c.0T0ja{01012!b 0sdc0ncJ1Gc70N101|2/cLc59(0nd%2X0f2`2j1x3.9L0n0Z9*0J1tdDbv0x9E523Gd|d_9;0I3J9xe835cM5R2teA3Lajd d04Bajdj3Gcf0`chaFald/d59~bJdzdBeudFeX6/dgdh3seSdKbQ04dNdq8)cUd:8.8:c.0wdY981s2`0udAdCdEb9d*d,dWa-eZc.c@ccb{c`a{1Be2e41{0n350R0=2!0n2Xe)b9ft1|0DebcK33eP3PeRbfcg0+eIe/9?fdd-4ndwbGav04f5fv1IbWe^dke`a:dVfQ8=f0ecb92R0+9L0u0jahfb3Gc-fN2td4fe1bexdiaebL9KbOf`04d?eydUeBb{d{d}9!d 0Q0/9L3l331|2Tea0nec33glcKf*enb30Jb8ag0n0fesfyb1ghfx101j0Z2$0?2!0T0xateJ1 eLeRfk0Ke31|e6gie90D00d!0nfn0D130B0neD0~gVeHd@3,gOeNd dpbYfRfvdJ49dgg`4nf_f@1 fPcXfRdadc0+g?dPe_040W1,1{g}3j1bg_e+a99d0NfVf}ar9d35aAhjdkdmaKd*cQeQeRg@dQ1b0Nc;e:4ghhf7e!04gLf;4*afg1hoe,aDe.3DhG4whPa5hxh8hAfGeVfIhf1 dl1bgUh#fX3#hIbvh*16g|hth;hbhJc.h2c=h{1faya3h#h%bih)h`3,h,04g*9xaMh:iafZc.f#h3f%1b0Z0p0s1q0if6h?g2faf$cjfMhN499Dh@3Hdziqc0eqd*g4gMaTg7aOg9d~a|ipir0nes0nfv0n0Lg!0Z0n2vbwgkgm0whM6!gNgaeR0c001j0,1g2x0!eei`fniXiZioiqgfg.49g:9;eOi5cT04hEiDg iAfOe#e~dZ9(d$d(aLiviKd1hAhWf^izixdfjgh03Td92!dbddi9g{dIjDhXfSiG0iiIc^cdhC049yieg2hyfEjqjra1h|iuhRa9jFj!fc9^b@h~jwjehg04h5jCfgfFj9hc2wiDbKhijx01h f~i20KaziD0shlhnfKhpiFhsj%eThvdojSh/d26Bh=8|jG9|j$k8dyjYklj}j fRk1k3jMh$g^h}ktj,jui1axk2i4kmh1kohVf~350JiHf:hzjNiyj)dtj-kKhLe$fSe(f7k7kMaC040PhU2*jW16dL4iifhBhadSkXiM9ee~f01f0d390N2Jit1sf.jmj}f?k`c/jtila)04f|kpkjf bNhZg2joi-k{fFiPgb010Y0Jl00+l21|fnj:0+iWf7gC0)bMagbSg5j4i/ajgQgSg)eEgVi)fB1teklHdca30n2m0 2XlGg0a50rlglo01j59VgUe8i!c7lv8W140Nc4gZcV0#2#bi0/l76fi.iN94j7kyig490D0o1b030n0(1t2m0+8Q9-i|fAed0Zi%gC2/jJlCg#l)kRjUkTd8j/2!fz0_kIkccnkLk.aG1bdnm3kSfhkqj|lhjvabjclci0mIkZjhmC1Ch6j8jOj^hekJjykrfJk)e,k6k4hq0skbmTkdmMhwm-j~9d2n0jj`kkm:ldmUi,n7h{lHhQm{mZ0Gk-9efRnclll81bjT1cjVk/iEm$mEi_k4mJnimRkBjpkznzjZnejEmVm j{nAkEmZn9mYhHankGkx58dOmQhajbnIn5m@hDk(mKcekemOna9qnn9Fnrmcme0nc4i#mjml0+gt0!j1g!mogn0Tb5gomun~gundmPj?jOfHn6ny8)aHidn*npkifYjahFf~8WnumGnFfOm?m ibmNh!a7n/md04mfi}lEk l10R0/i{o5lBftn{lUkhh9j(anj*kCm!j}bKlBnwnHmHnPmSnLnGnNk0nRoqo8k@okjQohd;90n.8qn:oBo5iXoFlxoHfogYefl#oKjAm(m9ojh{oo0imFm`o(jfoVlabKkwo-n%hSo!orj.o%n+o)k!pkpemznVoRa/j+phpfj.fTk%oZ0$nhnrk;7%o9haobiDibh.fWo/eTiij}iknO4nc$ctb.lal9pD1 jdp*c,d=nonUma4nbsa|a~0Nb0b2fto2b7bMba27m)link0J0Tl4f8m h_o#9P1b0EbTd~d*0zq3mBprodmUpJfLkVe{pno*h4p6j;nBp=2t97m+ohnrnJnEm;hkn#n!jIpwqnm|aIm~nmo@p8mAnbmxq7fUhKqukq0Zl02xn3ivbJ0=9^2/f9k!qmo?0xcyqTpyh{qmnrqbppjXq;k*q!lipvqkpVbgh(ocnrp@0c0s8Q0Rm_1$bcqa1b0PiDp@0n0$0nfDpZknpCpsjHip33q/m#q5qXpGlmk?oQr6k_p-01pY8qc$b,p%rJp)rvjsqriJp:pN5`p@b~c0c2l{1tc6c80wcar5ihr7i7r9qqoSkWrJkuaX9ib*a!0ia$c*qR0fq@5e0@8$8X8Is70@8L1J0!8Nsc2:2,2a2c2.0Z1`s98L1Prs1 jA0u0#0Z0;is0y0k1b1B1D1F1H0nno1S3t1Q1nq6c7sE3J1pgIl!9x0J0j0s0$bM0D0+0?9L0Tg(fn1f0p0`l!c12Ji`0j00l20d0X0/2JbNlCgy95i#0y2!0#1+250d0T0b0@0@0#0+0-0W0N0;19pc0N0Z0-3.0,0@tcte0@0chmf-p{0e0H0k0e0v0q0wtutw0v0%2K1:9(gzcLm21J0Z3L0f3wbxs604cJcL1JtR0xft9Kn~0 1i0}0X9%c7tZ1{0 0s0=s*0!l$lzi#tP95tRbukltRat1Z8K0`0|0~04.