Pythonin super()- ja __init__()-menetelmien tutkiminen

Python

Pythonin super()

Super()-funktion käyttö Pythonin olioohjelmoinnissa aiheuttaa usein hämmennystä aloittelijoille. Tätä tehokasta funktiota käytetään ensisijaisesti varmistamaan, että perusluokkien __init__()-metodeja kutsutaan oikein, mikä helpottaa ylläpidettävämpää ja skaalautuvampaa koodirakennetta.

Tässä artikkelissa perehdymme Base.__init__()- ja super().__init__()-käytön eroihin ja tutkimme, miksi super() on yleensä suositeltu lähestymistapa. Annamme myös koodiesimerkkejä havainnollistamaan näitä käsitteitä käytännössä.

Komento Kuvaus
Base.__init__(self) Kutsuu suoraan perusluokan __init__-metodia. Käytetään varmistamaan, että perusluokka on alustettu oikein.
super(ChildB, self).__init__() Kutsuu perusluokan __init__-metodia käyttämällä super()-funktiota. Tämä on suositeltu menetelmä perusluokkien alustamiseen.
print("Base created") Tulostaa viestin konsoliin. Käytetään virheenkorjaukseen ja sen vahvistamiseen, että perusluokka on alustettu.
print("ChildA created") Tulostaa viestin konsoliin. Käytetään vahvistamaan, että ChildA on luotu ja alustettu.
print("ChildB created") Tulostaa viestin konsoliin. Käytetään vahvistamaan, että ChildB on luotu ja alustettu.
print("Derived class with Base.__init__") Tulostaa viestin, joka osoittaa, että Derived-luokka on alustettu Base.__init__:lla.
print("Derived class with super().__init__") Tulostaa viestin, joka osoittaa, että Derived-luokka on alustettu käyttämällä super().__init__.

Pythonin super()-käytön perusteellinen selitys

Yllä olevat skriptit havainnollistavat käyttöä ja Pythonissa perusluokkien alustamiseksi luokkahierarkiassa. Ensimmäisessä skriptissä määrittelemme perusluokan nimeltä kanssa __init__() menetelmä, joka tulostaa "Perus luotu", kun luokan esiintymä alustetaan. Sitten määrittelemme kaksi johdettua luokkaa, ja . Sisään , Base.__init__(self) menetelmää kutsutaan nimenomaisesti sen sisällä menetelmä varmistaaksesi, että perusluokka on alustettu oikein. Tämä lähestymistapa on yksinkertainen, mutta voi olla hankala, jos perusluokkia on useita tai monimutkaisia ​​perintörakenteita.

Sisään , menetelmää käytetään sen sijaan. The Python-funktio on joustavampi ja ylläpidettävämpi tapa kutsua perusluokan menetelmiä, erityisesti useissa perinnöllisissä skenaarioissa. Se ratkaisee kutsuttavan menetelmän automaattisesti oikeassa järjestyksessä menetelmän ratkaisujärjestyksen (MRO) mukaisesti. Tämä ei ainoastaan ​​yksinkertaista koodia, vaan tekee siitä myös kestävämmän ja mukautuvamman luokkahierarkian muutoksiin. Toinen skripti tarkentaa näitä käsitteitä edelleen vertaamalla suoraa käyttöä Base.__init__() ja toiminto, joka osoittaa, kuinka kukin menetelmä vaikuttaa alustusprosessiin.

Pythonin super():n ymmärtäminen luokan perinnössä

Python - Super():n käyttäminen perusluokan __init__() kutsumiseen

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()

Perusluokan alustuksen erojen tutkiminen

Python - perustan vertailu.__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()

Sukellus syvemmälle Pythonin super()-funktioon

Vaikka aiemmat selitykset keskittyivät peruskäyttöön ja , on tärkeää ymmärtää joitain käytön edistyneitä puolia ja etuja . Yksi keskeinen etu on sen yhteensopivuus usean perinnön kanssa. Monimutkaisessa luokkahierarkiassa, jossa luokka voi periä useista perusluokista, käyttämällä super() varmistaa, että kaikki perusluokat on alustettu oikein MRO:n (Methode Resolution Order) mukaisesti. Tämä estää mahdolliset ongelmat, joissa perusluokka saatetaan alustaa useita kertoja tai ei ollenkaan.

Toinen tärkeä näkökohta on koodin parempi luettavuus ja ylläpidettävyys. Käytettäessä , ohjelmoijan on nimettävä perusluokka selvästi, mikä tekee koodista vähemmän joustavaa. Jos perusluokan nimi muuttuu tai periytymisrakenne kehittyy, jokainen suora kutsu on päivitettävä. Verrattuna, tiivistää pois perusluokan nimen, mikä tekee koodista mukautuvamman muutoksiin. Tämä abstraktio on myös linjassa polymorfismin ja kapseloinnin periaatteiden kanssa, jotka ovat olennaisia ​​olio-ohjelmoinnissa.

Yleisiä kysymyksiä ja vastauksia Pythonin superista ()

  1. Mikä on Pythonissa?
  2. on sisäänrakennettu toiminto, jonka avulla voit kutsua menetelmiä ylä- tai sisarusluokasta, mikä varmistaa oikean alustuksen ja menetelmän ratkaisun periytymishierarkiassa.
  3. Kuinka erota ?
  4. ratkaisee kutsuttavan menetelmän dynaamisesti MRO:n perusteella, kun kutsuu suoraan tiettyä perusluokkamenetelmää, joka on vähemmän joustava.
  5. Miksi on mieluummin moniperinnössä?
  6. Moniperinnössä, varmistaa, että kaikki perusluokat on alustettu oikein MRO:n mukaisesti, välttäen päällekkäiset tai puuttuvat alustukset.
  7. Voi käyttää ulkopuolella ?
  8. Joo, voidaan kutsua mitä tahansa menetelmää vanhempi- tai sisarusluokasta, ei vain .
  9. Mikä on menetelmän ratkaisujärjestys (MRO)?
  10. MRO on järjestys, jossa Python etsii menetelmiä luokkahierarkiassa. Se määritetään C3-linearisointialgoritmilla.
  11. Millaisena näet luokan MRO:n?
  12. Voit tarkastella MRO:ta käyttämällä menetelmä tai attribuutti.
  13. Mitä tapahtuu, jos et käytä johdetussa luokassa?
  14. Jos et käytä , perusluokkaa ei ehkä ole alustettu oikein, mikä voi johtaa mahdollisiin virheisiin tai odottamattomaan toimintaan.
  15. Onko mahdollista käyttää Python 2:ssa?
  16. Kyllä, mutta syntaksi on erilainen. Python 2:ssa käytät , kun taas Python 3:ssa käytät yksinkertaisesti .

Käyttämällä Pythonissa ei vain takaa perusluokkien oikeaa alustusta, vaan myös parantaa koodin joustavuutta ja ylläpidettävyyttä. Se on erityisen hyödyllinen useissa periytymisskenaarioissa, joissa suorat kutsut perusluokan menetelmiin voivat olla hankalia ja virhealttiita. Abstrahoimalla perusluokkien nimet, mahdollistaa puhtaamman ja mukautuvamman koodin. Ymmärtää vivahteita vastaan Base.__init__() on välttämätön vankan oliopohjaisen Python-koodin kirjoittamiseen.