- Ukukhiqizwa okuzenzakalelayo kwezindlela ezibalulekile zokudonsa amanzi njenge-__init__, __repr__, kanye ne-__eq__ ukunciphisa i-boilerplate.
- Ukulawula okuthuthukisiwe kokuziphatha kwezinto ngokusebenzisa amapharamitha afana nokuqandisa ukuze kungaguquki kanye nokuhleleka kokuhlunga.
- Ukwenza ngokwezifiso izinkambu ngazinye kusetshenziswa umsebenzi we-field() kanye ne-post-instantiation logic nge-__post_init__.
- Ukuhlanganiswa okungenamthungo ngokubonisa uhlobo kanye nokusekelwa kwefa lekilasi ukwakha amazinga edatha ayinkimbinkimbi.
Wake wazizwa sengathi uchitha isikhathi esiningi ubhala izindlela zokwakha eziphindaphindwayo kunokuhlela i-logic yephrojekthi yakho? Uma wake wakha ikilasi ukuze nje ubambe inani elikhulu lamanani, uyazi ukuthi kunzima kangakanani ukuhlanganisa yonke impikiswano ngesandla ku- self.attribute . Kuyadina, kuthambekele ekubhaleni amagama, futhi empeleni, kuyadonsa kancane kunoma yimuphi unjiniyela ozama ukugcina i-codebase yakhe ihlanzekile.
Faka amakilasi edatha e-Python , i-game-changer eyethulwe kunguqulo 3.7 nge- dataclasses module . Lokhu akuyona uhlobo olusha lwekilasi kodwa kuyindlela ehlakaniphile yokusebenzisa umhlobisi ukuze wenze ngokuzenzakalelayo izingxenye eziyisicefe zohlelo oluqondiswe ezintweni. Ngokusebenzisa i-PEP 557 kanye ne-PEP 526 , zikuvumela ukuthi uchaze isakhiwo sedatha yakho usebenzisa izichasiselo zohlobo, okuvumela i-Python ukuthi iphathe ukuphakanyiswa okunzima kokukhiqiza imishini engaphansi.
Umlingo Womhlobisi we-@dataclass

Emongweni wayo, umhlobisi we- @dataclass uskena incazelo yekilasi lakho ukuthola iziguquguquko ezinezinkomba zohlobo. Uma isizitholile, ifaka ngokuzenzakalelayo izindlela eziningana ze-"dunder" (double underscore) ekilasini lakho. Inzuzo esheshayo kakhulu yindlela ye- __init__() , okusho ukuthi ungasungula into yakho ngaphandle kokubhala umugqa owodwa we-assignment logic. Kodwa akugcini lapho; uthola nendlela ye- __repr__() enikeza ukumelwa kwentambo okuhlanzekile, okufundekayo kwento yakho, okwenza ukulungisa amaphutha kube lula uma kuqhathaniswa namakheli enkumbulo e-cryptic owatholayo ngezigaba ze-vanilla.
Ngaphandle kwezisekelo, umhlobisi uhlinzeka ukuhlolwa kokulingana nge-__eq__(). Ekilasini elijwayelekile, ukuqhathanisa izinto ezimbili nedatha efanayo usebenzisa == izobuyisela i-False ngoba i-Python ihlola ukuthi iyisibonelo esifanayo yini kwimemori. Amakilasi edatha ashintsha lokhu ngo ukuqhathanisa amanani angempela yamasimu, uphatha into njenge-tuple yedatha yayo. Ungavumela ngisho amakhono okuhlunga ngokusetha i-oda = Iqiniso, okukhiqiza izindlela ezifana __lt__ futhi __gt__, okukuvumela ukuthi uhlele uhlu lwezinto ngokusekelwe ezimfanelweni zazo.
Ukuziphatha Okuhle Kokulungisa Ngamapharamitha
Umhlobisi we-@dataclass ungalungiseka kakhulu. Isibonelo, uma ufuna ukulingisa izinto zokufunda kuphela, ungasetha iqandisiwe = YiqinisoLokhu kuvimbela noma yisiphi isici ukuthi siguqulwe ngemva kokuba into idaliwe, kuphonswe I-FrozenInstanceError uma othile ezama ukushintsha inani. Nakuba lokhu kunezela ukusebenza okuncane ngesikhathi sokufakwa, kuyindlela enhle yokuqinisekisa ubuqotho bedatha kulo lonke uhlelo lwakho lokusebenza. Uma ukhathazekile ngenkumbulo noma isivinini, ukusetha izikhala = Iqiniso kungenza amakilasi akho abe lula futhi asheshe ukuwadala ngokuvimbela ukudalwa kokuzenzakalelayo __dict__.
Amanye amapharamitha awusizo afaka phakathi i-kw_only=True , ephoqa zonke izimpikiswano kumakhi ukuthi zidluliswe njengezimpikiswano zamagama angukhiye, okunciphisa ingozi yokudlula amanani ngokulandelana okungalungile. Kukhona futhi i-match_args , esiza ikilasi ukuthi lisebenze kahle ngokufanisa iphethini yesakhiwo sikaPython. Uma uthola ukuthi awudingi indlela ethile, njengomakhi noma intambo yokumelela, ungamane usethe i-init=False noma i-repr=False ukuze utshele i-Python ukuthi izidlule.
Ukucwila Kakhulu Ensimini () Umsebenzi
Ngezinye izikhathi, isichasiselo sohlobo olulula asanele. Yilapho-ke umsebenzi wensimu() kuyasetshenziswa. Kukuvumela ukuthi unikeze imiyalelo ehlanganisiwe yemfanelo ngayinye. Isibonelo, uma unensimu okungafanele ibe yingxenye ye __init__ indlela kodwa kufanele ukuthi ikhona entweni, ungayisetha init=FalseNgokufanayo, ungafihla idatha ebucayi ku- __repr__ okukhiphayo ngokusetha repr=False.
Enye yezindlela ezibaluleke kakhulu zokusebenzisa field() uyaphatha amanani azenzakalelayo angaguquguqukaKu-Python, ukusebenzisa uhlu noma i-dict njengempikiswano ezenzakalelayo kuyindlela yokuxazulula inhlekelele ngoba okuzenzakalelayo kwabelwana ngakho kuzo zonke izimo. Ukulungisa lokhu, usebenzisa ifektri_ezenzakalelayoNgokudlulisa ucingo olubizwayo (njengo list or dict), i-Python iqinisekisa ukuthi isibonelo esisha sento eguquguqukayo kudalwa njalo lapho kuqaliswa i-dataclass entsha, kugwenywa i-bug eyesabekayo ye-shared-state.
I-Advanced Logic kanye nefa
Uma udinga ukwenza izibalo noma ukuqinisekiswa ngokushesha ngemva kokudalwa kwento, indlela ye-__post_init__() ungumngane wakho omkhulu. Selokhu kwakhiqizwa i-@dataclass __init__ uphatha imisebenzi eyisisekelo, __post_init__ ikuvumela ukuba thola amanani amasha kusuka emasimini akhona. Lokhu kuvame ukusetshenziswa kanye I-InitVar, echaza iziguquguquko ezidluliselwa kumakhi kanye __post_init__ kodwa azigcinwa njengezimfanelo zangempela kulesi sibonelo.
Ifa lisebenza ngokwemvelo ngamakilasi edatha, kodwa kukhona ukubamba mayelana namanani azenzakalelayo . Uma udla ifa ekilasini ledatha, i-Python ihlanganisa amasimu ekilasini lesisekelo kanye nekilasi elisuselwe ngokulandelana. Ngenxa yokuthi i-Python isingatha kanjani izimpikiswano zomsebenzi, insimu enenani elizenzakalelayo ayikwazi ukulandelwa yinye ngaphandle kweyodwa . Ngakho-ke, uma ikilasi lakho lesisekelo linanoma yiziphi izimfanelo ezinamanani azenzakalelayo, yonke imfanelo ekilasini lengane kumele futhi ibe nenani elizenzakalelayo ukuze kugwenywe i-TypeError.
Iziqukathi Zedatha vs. Amakilasi Okuziphatha
Kubalulekile ukukhumbula ukuthi amakilasi edatha ngokuyinhloko ayiziqukathi zesimo, hhayi ukuziphatha . Ngenkathi ungangeza izindlela kuzo, ukwengeza i-logic eyinkimbinkimbi, eshintsha isimo kungangcolisa inhloso yokwakha. Uma ikilasi lakho liba yinto eyinkimbinkimbi enezindlela eziningi ezishintsha isimo salo sangaphakathi, kungase kube yisikhathi sokushintshela ekilasini elijwayelekile le-OO . Amakilasi edatha akhanya kakhulu uma esetshenziselwa ukumodela isizinda , ukudlulisa ulwazi phakathi kwezingqimba zesistimu, noma ukudala izimpendulo ezilula ze-API.
Ukuze uqhubeke nokwenza lula ukuhamba komsebenzi wakho, imodyuli inikeza imisebenzi yokusetshenziswa efana ne-asdict() kanye ne-astuple() , eguqula ngokuphindaphindiwe amakilasi akho edatha ahlanganisiwe abe izichazamazwi noma ama-tuples ajwayelekile e-Python. Kukhona futhi i-replace() , edala ikhophi engajulile yento ngenkathi ikuvumela ukuthi ushintshe amasimu athile, okwenza ifaneleke kakhulu ekusebenzeni ngezimo eziqandisiwe lapho ukuguqulwa okuqondile kuvinjelwe khona.
Ngokwenza ngokuzenzakalelayo i-boilerplate yabakhi, izethulo, kanye nokuhlolwa kokulingana, la mathuluzi avumela abathuthukisi ukuthi bagxile esakhiweni sedatha sangempela kunokwakheka kokudalwa kwekilasi. Kungakhathaliseki ukuthi wakha iqoqo elilula lama-constant noma ukuhlelwa kwedatha okuyinkimbinkimbi okuhlanganisiwe, ukusebenzisa laba bahlobisi kuqinisekisa ukuthi ikhodi yakho ihlala imfushane, ifundeka, futhi igcinwa ngenkathi isebenzisa amandla aphelele esistimu yohlobo lwePython.