La classe Train⚓︎

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)
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
.128013lS]et-dA5!f18%umaèg,_F/R=in{ 6)yàqPhcDLN[(bEs.p;r4jC'90"ovT+w73Ok:éW }2030b08090l0u050N0.0F050l0N0N0t0Y090u0P0Y020x030N0j0k0k0l0R0A02060Z050j140Z0v0.000l0k0P0Q0.0s081e0R0C0j080N030r1b1d1f1h190P02031M1F1P0r1M190b0u0!0|0~10120E0u0n0E051%0E0917030@0L05081Y0 110Y1$1'1)1'091/1;1-090R1N090E0|1k0N0P0l0v120:0Y1?1!0Y0f0_080v1s081-292b2g1^2j1;2m0k2o02040.0D0R0Z0P0Z0N0u1n1p0=270R0R080F2J1F2q0v1N0r252V2224231.0b2s121)0v2l2G1-1V1X0}1@2(0u2*0v0Z2.1-0P2O1N2T2V2 1a2a1p2:2h2^0R1e05170.0g2S3318322r351^37393b0:3e2b3g2T2'0Y3l0l3a020.0(3p2U193s3j123v3x0.0S3B3r333t3H3b0d3L3D3N3F3u0Z383w3b0y3S3h341Z3k3X3m3y0'3$3E3(3G3*3Z3y0h3.3U3:3W3Y3I0W3_3i3{3P020g0X403'2;3|3+0g3d1G3f3T4149430g3o4e3q4g48363=3x0g3A4m3C3%3O4r170g3K4v3M4h4q3}4A3R4D4o4y4H443#4K4x3V4j3-4Q3/4i4z443^4V3`4X4N0g3 4#4F3)4N0:464*4p4,3+0:4d2 4L4S4Y0:4l4_4R424|4u4 4W4G4?4C544$563?0:4J594+3;4-4P5f4;5h4?4U5k4M4?4!5p4{4-4)5t514N0(4/5x4%3+0(4^4f505D3?0(4~5H554=5K535N5a5P3x0(585S5g4a5K5e5Y5l5!5V5j5%5q5K5o5+5u5E5s5/5y5E5w5?5J3x0S5B5`5b5|5G4n5I60170S5M635O5m3?0S5R695T6b5|5X6f5Z430S5$6k5'6m5*6p5,5|5.6t5:6c5=6x5@6c5_6B5{170d5~6F65020d624w6a5(6H686P6g6R6M6e6U6l4Y0d6j6Z6q6#6o6'6u6H6s6+6y3x0d6w6/6C6;6A6@6G6M6E6{6L0y6J6 5U170y6O4E6(4N0y6T786,020y6Y7d6:756%7i6^756*7m6|0y6.7q706?7u747f6`7x6h756~7B6W0'727F430'774`7n020'7c7N6|0'7h7S6L0'7l7W7y0'7p7!7C7P7t7'7G7w7+7K7A7.4Y0'7E7;4N0h7I7^3+0h7M647y0h7R807(0h7V846W0h7Z88430h7%8c4Y0h7*8g7_7-8k7}7A1Q2}1F2.2Y0b242%3V0F2_2y0;1W1N2|082~3f3L038z0=8H5Z0*173j3L0.8c0F170-0l0n1o8J6Q16020+3S0.8*8T6Q8P020=0f8S880f0k170p0p2?2I8`8#6V8%0K8 5Z0L8%0N08058;4D888%0o8=6Q0v8Q1o092l0j935'8%0z8(4K8+9t8,6V0N2e02001B0Z090Q0U1o0N220j2Q080j0R9A0j9C0Q8)9u8*88951797999n3t0Z170O9!4S9i0v9k0v9m4D9v5Z9$020t9f6V9h028z9+9l9S9T9V96989a316Q9=9'9b9g9X0j1W2b099^9;179@9/880*8V020I1o083S0x9tal178:ag5'8@8_0p2O2|8~a9901792aG94a29ZaK9o179q9 9u889x179O9Q0c0f2j0F0E8Y1=0b2b0{0~270v0N1k08aX9DaSau8-172O099M0vay3t0N0l17a48I6QaV9z9B9D8X8Z2K1=9(3{2H170wbf499W029Yb43q88a7bk369*9,9.a59w0u170/bt1^b7a=9R4Kat8+av8/08bp2U9:az8^028`9H0RaFby5Z91bD12bmbob#0Y9p9r4_9T9Ub69ybG9F0v0!080R2H1o0.2l0.bV2?0nbGa@bKa_02a{a}a 3Vb%a3b(bsaO3taAbTaC08aE0pb(910zas7+8.8Rak9gan0#0R0^a~cf3V8%b+4fa^6V8.axcu6Vch8`8|09bXb5aH02aJbY5'cbaNcV3tb*c3b.9wb:b99E9G9I9K9Mc29sb-a19XcccB3{cecZ9)028F0k0ub^c9c_aid249am17ap2*c$bQ3tcXbO8N5'c`cR6l170v0L0p0%8Y9Gd52h9=aj2 dc3Vc 177{bJc%8OawbNds3k0f171DcP0!0u0=cnaIb(dedQ02aR4:3t0%3bc;c^490N0baWc)bGbG2Ob?0Zd00.cx1Cb~0u0|1=22czb|9H0.dN2L0K2*271t3X9k0.0l9J0j1pdpbc0z9edX3Vd'd!9T0q3w97d@2^cA5C2hej3yb-d+d*c)dbbLc70Rer3fdx3{dTd$dt9%b(9`dmdodqa.dH12dudveF88dz02dBcGdEbMdfeG4idJ8/1o2*0peOeddreJ1^b!e=b$aMdf9caQcE4nb-e(etc(9P9D1xd.d:1;0.2^0k0L2O0.2Le:a.ff1=0Fd`cy2?c/b,c;c5eCeE3qf11^eIc{d302a8fz4idldnfh1EbIe#5'cIdGcK6le*d{a.2F0R9k0p0bbxdjaPcTdSe`dUegdw8cbv9~e^b)e}47dYekaTf-euexf40QbG0G0,9k382?1=2Hd_0.d{2?g5cyfSe6a(0ja-bw0.0Kebfka%g1fj0|1f0l2Q0m2O0N0zfC5 bEd(ev9Tf60!d/1=d=g2d^0F00010(0W0QdL0.f90F0 0o0.em0`gGeqf:eigyf0f_9QfpcFfr9_17fheS0Ydug.fyfZ9#eLf-9`c~d00ReAc50%1$1;g.9`g-fOdhdZ020ufIf)a6h82^afh63td7aoaqdUe~3Cf0fKhi170ue'f*02h5fDeKfBeMf+9-g.eUh3hCfYbq8$17hn18hpg*e$ftg.hjgFdbhqc|hxeWa6d4hhhXeQcdg^hy3kabad9+g~cHa`0?c8h$3{hjgV97ashWh^dFhu9ge*0l0T0Z1m08ePbcdUcUg?caf%f-9dhG022^0jb@e9dUdWes1^h8f0b(f^eyf`bG0ci4i60.eb0.fh0.0BgP0l0.2jbdg4g60vgv6Kgxf=9t0HgJgL0Q1f0n1c2l09d}i$f9iEiGi3i5f gZbgg#ewivg'ezc:a0c5htg;ieh*eTh)ic42dK9H0pe0arifaIiog)hOc=bnc@i~g/j0hJg+c}2Oc d1h@49g:jpbuiii5ilhIhohPfLdKgWhmhVc4jkhYfvbrh#hc6Vg=jjahhAg_17g{jofqjcg h1j7jLdkhwh'f-dijO6qh,0!aehEh8haj.dl9ChSand9jZj149cDjEi_jGj%j!dhjKhZk0i9j'ji2Uhv1bh-hgjVhphvjHkah!jQjg9`kcj,h.js1^jrk23Oj=ik08imi^aT6QjNkj6Vj(kEj#e/eQhbk5jP0$eVjI6QeY7MdCfw12fMi09_e*1b0P2|0u2xi81ofWj`j)c!dRf-kDdgk.02f(kMj*9{9jf,jgc#eh3{ird#jgiuiwi=9D060jk$0Rk'1=f9jT0RiDeQgm0w9|bwbCl0d%i:gA2lgCd:h`gGiMfn1pe3lmd09+0.2a0{2Lllk|9-0/k^iQ12euf0gFd@iHb~la8F100ub{gObN0f2Pa|0,k,73lPlr9ug%9Dg(e jz3t0F0g17010.0)1p2a0R8z9Mi'fmd|0liKgm22jvb^gPfklKjxhNl?c|8Ffl0=kqku3Vktk_hij^hlkAh}fEj$k7mnfAkPbPjdb'k8klj{jtlgh/e$h02kihki3ybrj/kLkQkFhej?krkWmsdamYg/h82b0bmOk1mHksk9k=c|lmk}mqmo170emBmQaak{9}hDj88'j~kV3ujS2Omki#hEk4mUj#mPkUism|mPn3mpnbk`mPjJmGk-c|koj-fJmhh~h9kYncm+nk9#mSj@d8mtk~hL8Sn3l^l`0.b{iIl m10Rgd09i,mcg8d|b1fim9kxlhgQmen2eBh=eDnD02lwmKjAnwihmj08mlkem?c_nCm$hjj_jD9/nJl_02l{i(ljk#k%0k0,i%nVlgffnSlzn(kCi}m,i nokHk`mJm$njmCngnzoog@onm/j2bnackpn_l=j e$98h{n0hMdD5'nKo4nViEo8lcoafaiVgMgOlGodjmg|oijkn?n^h(oykboCnsmzjqnaotk68!mFiPownqo-mmjbkBjMoknpfAo_ozmwkJbcmTo=jP0am`n3kSn/hrc6n*fupafLcwnRl*18kUbLcJo/2hcMcjcliaf$c?cYolf.dVhMnejF5ZbFc)aZa#a%0na(a*lU9|a/1;l;jyoGk`m;9-0Nk)eRoro;m{cS0Jitf3i?f`dU07pgh%myn`o:9?i|pBe{kkp4hvoqkfmv2h8.mMh2m$h4ovp*9;n|puksmWoEplmrnEm#nGn1munumwp!0jp$fHo*q0m|0lk$2lm)n0ibp24i0L9X22pzjRmxo@qn0zcpqppYkvqMpkqck3p{q9g,qbnnqxjknro}oFo hQpjg.pKf`0H0Z8z0k9C1Wa;i@qfom0$q.p.9D0.0a1qq{pDkGp5jti42?qKkmhHqukKinh|pIn:ptp_pvbSbU22cQqF2he@jgk;e|pFp?bgr0c*b?b^b`1pb}b 0vc1r5q*q41^8.hRm$rwp b(pwaDbWcmqDqQ4 0r8L8G8qr'0r8t1F098vr,2#2W0l1:r)8t1Lr81^jm0p0f0l0*i70E0(171x1z1B1D0.hM1Q3g1M1jqtb~s83w1lgslF970j0b0Z0a9|0F0R0m9k0NgTf91b0T0?lFb^2xi$0b0Vk'0P050,2x9}lhgi8TiI0E2O0f1#1~0P0N0+0r0r0f0R0O0%0u0*15n@0u0l0O3X0n0rs(s*0r0HhafVa$0l0i0U0(0i0c0M0vs~t00c0W2y1)9Hgjczl)1F0l3y0K3jber%02cxcz1Ftl0zff9jmc0{1e0_059Gb~tt1;0{0Z0LsA09lHleiItj8Ttlbbo@tla81T8s0?0^0`02.