Python super() un __init__() metožu izpēte

Python

Darba sākšana ar Python super()

Funkcijas super() izmantošana Python objektorientētajā programmēšanā iesācējiem bieži rada neskaidrības. Šī jaudīgā funkcija galvenokārt tiek izmantota, lai nodrošinātu, ka bāzes klašu metodes __init__() tiek pareizi izsauktas, veicinot labāk uzturējamu un mērogojamu koda struktūru.

Šajā rakstā mēs iedziļināsimies atšķirībās starp Base.__init__() un super().__init__() izmantošanu un izpētīsim, kāpēc super() parasti ir ieteicamā pieeja. Mēs arī sniegsim kodu piemērus, lai ilustrētu šos jēdzienus praksē.

Komanda Apraksts
Base.__init__(self) Tieši izsauc bāzes klases __init__ metodi. Izmanto, lai nodrošinātu, ka bāzes klase ir pareizi inicializēta.
super(ChildB, self).__init__() Izsauc bāzes klases metodi __init__, izmantojot funkciju super(). Šī ir ieteicamā metode bāzes klašu inicializācijai.
print("Base created") Izdrukā ziņojumu konsolei. Izmanto, lai atkļūdotu un apstiprinātu, ka bāzes klase ir inicializēta.
print("ChildA created") Izdrukā ziņojumu konsolei. Izmanto, lai apstiprinātu, ka ChildA ir izveidots un inicializēts.
print("ChildB created") Izdrukā ziņojumu konsolei. Izmanto, lai apstiprinātu, ka ChildB ir izveidots un inicializēts.
print("Derived class with Base.__init__") Izdrukā ziņojumu, kas norāda, ka atvasinātā klase tika inicializēta, izmantojot Base.__init__.
print("Derived class with super().__init__") Izdrukā ziņojumu, kas norāda, ka atvasinātā klase tika inicializēta, izmantojot super().__init__.

Padziļināts Python super() lietojuma skaidrojums

Iepriekš sniegtie skripti ilustrē izmantošanu un Python, lai inicializētu bāzes klases klašu hierarhijā. Pirmajā skriptā mēs definējam bāzes klasi, ko sauc ar an __init__() metode, kas izdrukā "Bāze izveidota", kad tiek inicializēts klases gadījums. Pēc tam mēs definējam divas atvasinātas klases, un . In , Base.__init__(self) metode ir skaidri saukta tās ietvaros metode, lai nodrošinātu, ka bāzes klase ir pareizi inicializēta. Šī pieeja ir vienkārša, taču var būt apgrūtinoša, ja ir vairākas bāzes klases vai sarežģītas mantojuma struktūras.

In , tā vietā tiek izmantota metode. The funkcija Python ir elastīgāks un apkopējamāks veids, kā izsaukt bāzes klases metodes, īpaši vairākos mantojuma scenārijos. Tas automātiski atrisina izsaucamo metodi pareizajā secībā, ievērojot metodes izšķiršanas secību (MRO). Tas ne tikai vienkāršo kodu, bet arī padara to izturīgāku un pielāgojamāku klases hierarhijas izmaiņām. Otrajā skriptā šie jēdzieni ir sīkāk izstrādāti, salīdzinot tiešo lietojumu Base.__init__() un funkcija, parādot, kā katra metode ietekmē inicializācijas procesu.

Python super() izpratne klases mantojumā

Python — izmantojot super(), lai izsauktu bāzes klasi __init__()

class Base(object):
    def __init__(self):
        print("Base created")

class ChildA(Base):
    def __init__(self):
        Base.__init__(self)
        print("ChildA created")

class ChildB(Base):
    def __init__(self):
        super(ChildB, self).__init__()
        print("ChildB created")

ChildA()
ChildB()

Pamatklases inicializācijas atšķirību izpēte

Python — bāzes salīdzināšana.__init__() vs super().__init__()

class Base:
    def __init__(self):
        print("Base class initialized")

class DerivedWithBaseInit(Base):
    def __init__(self):
        Base.__init__(self)
        print("Derived class with Base.__init__")

class DerivedWithSuperInit(Base):
    def __init__(self):
        super().__init__()
        print("Derived class with super().__init__")

print("Creating DerivedWithBaseInit:")
derived1 = DerivedWithBaseInit()

print("Creating DerivedWithSuperInit:")
derived2 = DerivedWithSuperInit()

Iedziļināties Python super() funkcijā

Lai gan iepriekšējie paskaidrojumi bija vērsti uz pamata lietojumu un , ir svarīgi saprast dažus papildu aspektus un lietošanas priekšrocības . Viena no galvenajām priekšrocībām ir saderība ar vairāku mantojumu. Sarežģītā klašu hierarhijā, kur klase var mantot no vairākām bāzes klasēm, izmantojot super() nodrošina, ka visas bāzes klases ir pareizi inicializētas saskaņā ar metodes izšķiršanas secību (MRO). Tas novērš iespējamās problēmas, kuru dēļ bāzes klase var tikt inicializēta vairākas reizes vai netiek inicializēta vispār.

Vēl viens būtisks aspekts ir uzlabota koda lasāmība un apkope. Lietojot , programmētājam ir skaidri jānosauc bāzes klase, padarot kodu mazāk elastīgu. Ja mainās bāzes klases nosaukums vai attīstās mantojuma struktūra, katrs tiešais izsaukums uz ir jāatjaunina. Turpretim abstrahē bāzes klases nosaukumu, padarot kodu vieglāk pielāgojamu izmaiņām. Šī abstrakcija sakrīt arī ar polimorfisma un iekapsulēšanas principiem, kas ir būtiski objektorientētajā programmēšanā.

Bieži uzdotie jautājumi un atbildes par Python super()

  1. Kas ir Pythonā?
  2. ir iebūvēta funkcija, kas ļauj izsaukt metodes no vecāku vai brāļu klases, nodrošinot pareizu inicializēšanu un metodes izšķirtspēju mantojuma hierarhijā.
  3. Kā atšķiras no ?
  4. dinamiski atrisina izsaucamo metodi, pamatojoties uz GRO, kamēr tieši izsauc konkrētu bāzes klases metodi, kas ir mazāk elastīga.
  5. Kāpēc ir priekšroka vairākkārtējai mantošanai?
  6. Daudzkārtējā mantojumā, nodrošina, ka visas bāzes klases tiek pareizi inicializētas saskaņā ar MRO, izvairoties no inicializācijas dublikātiem vai trūkstošām.
  7. Var izmantot ārpus ?
  8. Jā, var izmantot, lai izsauktu jebkuru metodi no vecāku vai brāļu klases, nevis tikai .
  9. Kas ir metodes izšķiršanas secība (MRO)?
  10. MRO ir secība, kādā Python meklē metodes klašu hierarhijā. To nosaka C3 linearizācijas algoritms.
  11. Kā jūs skatāties uz klases MRO?
  12. Varat skatīt MRO, izmantojot metode vai atribūts.
  13. Kas notiek, ja nelietojat atvasinātā klasē?
  14. Ja neizmantojat , bāzes klase var nebūt pareizi inicializēta, izraisot iespējamās kļūdas vai neparedzētu darbību.
  15. Vai ir iespējams izmantot Python 2?
  16. Jā, bet sintakse ir atšķirīga. Programmā Python 2 jūs izmantojat , savukārt Python 3 jūs vienkārši izmantojat .

Izmantojot Python ne tikai nodrošina pareizu bāzes klašu inicializāciju, bet arī uzlabo koda elastību un apkopi. Tas ir īpaši izdevīgi vairāku mantojuma scenāriju gadījumos, kad tiešie izsaukumi uz bāzes klases metodēm var kļūt apgrūtinoši un pakļauti kļūdām. Abstrahējot bāzes klašu nosaukumus, nodrošina tīrāku un pielāgojamāku kodu. Izpratne par niansēm pret Base.__init__() ir būtiska, lai rakstītu stabilu objektu orientētu Python kodu.