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

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

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 super() un Base.__init__() Python, lai inicializētu bāzes klases klašu hierarhijā. Pirmajā skriptā mēs definējam bāzes klasi, ko sauc Base 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, ChildA un ChildB. In ChildA, Base.__init__(self) metode ir skaidri saukta tās ietvaros __init__() 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 ChildB, super(ChildB, self).__init__() tā vietā tiek izmantota metode. The super() 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 super() 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 super() un Base.__init__(), ir svarīgi saprast dažus papildu aspektus un lietošanas priekšrocības super(). 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 Base.__init__(), 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 Base.__init__() ir jāatjaunina. Turpretim super() 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 super() Pythonā?
  2. super() 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. super() atšķiras no Base.__init__()?
  4. super() dinamiski atrisina izsaucamo metodi, pamatojoties uz GRO, kamēr Base.__init__() tieši izsauc konkrētu bāzes klases metodi, kas ir mazāk elastīga.
  5. Kāpēc ir super() priekšroka vairākkārtējai mantošanai?
  6. Daudzkārtējā mantojumā, super() 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 super() izmantot ārpus __init__()?
  8. Jā, super() var izmantot, lai izsauktu jebkuru metodi no vecāku vai brāļu klases, nevis tikai __init__().
  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 ClassName.mro() metode vai ClassName.__mro__ atribūts.
  13. Kas notiek, ja nelietojat super() atvasinātā klasē?
  14. Ja neizmantojat super(), 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 super() Python 2?
  16. Jā, bet sintakse ir atšķirīga. Programmā Python 2 jūs izmantojat super(ClassName, self).method(), savukārt Python 3 jūs vienkārši izmantojat super().method().

Apkopojot galvenos jēdzienus

Izmantojot super() 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, super() nodrošina tīrāku un pielāgojamāku kodu. Izpratne par niansēm super() pret Base.__init__() ir būtiska, lai rakstītu stabilu objektu orientētu Python kodu.