Sissejuhatus hävitajasse Pythonis
Ehitajad ja hävitajad on pythoni kaks olulist mõistet. Konstruktoriteks kutsutakse klassi objekti loomisel. Hävitajad kutsutakse aga siis, kui klassi objekt hävitatakse. Seega pole vale öelda, et konstruktorid on hävitajate vastand. Python, mis on objektorienteeritud programmeerimiskeel, on konstruktorid ja hävitajad ka selle keele osa.
Destruktoreid ei kasutata pythonis nii palju kui Java ja C ++. Kuid selle teadmine muudab pütoni veelgi tugevamaks.
Destruktorid võivad osutuda programmi väga mõistlikuks tööks väga kasulikuks. Näiteks: kasutatud ressursside vabastamine enne programmist väljumist, näiteks mälestuste vabastamine, failide sulgemine jne.
Destructori määratlemiseks kasutatav märksõna on: __del __ () märksõna:
Süntaks:
def __del__(self):
#destructor body
Nagu näha, on hävitaja määratlemiseks märksõna __del__. Kui seda kutsutakse, kustutatakse kõik viited sellele objektile, mida nimetatakse ka prügiveoks.
Destruktori näited Pythonis
Vaatame pythonis hävitaja erinevaid näiteid, et saada paremini aru:
Näide nr 1
class Grocery:
# Initializing
def __init__(self):
print('Grocery created.')
# Deleting (Calling destructor)
def __del__(self):
print('Destructor called, Grocery deleted.')
obj = Grocery()
del obj
Väljund:
„Toiduained” on klass, mis on määratletud spetsiaalsete meetoditega: ehitaja ja hävitaja.
Nii saab näha, kui klassi „Toiduained” objekt on loodud. See kutsub automaatselt __init__, mis on klassi konstruktor. Ent kui objekti kustutamiseks käivitatakse “del obj”, kutsutakse hävitaja meetod automaatselt.
Näide 2
class Text:
def __del__(self):
print "Text deleted"
a = Text()
del a
a = Text()
b = a
del b
del a
Väljund:
Tekst on klass, “a” on objekti viide klassile. Selle viite „a” kohalik koopia „b”. Nii et kui b kustutatakse, siis meetodit ei kutsuta, kuna see hoiab lihtsalt kohalikku koopiat.
Destructori eelised Pythonis
Nagu varem öeldud, ei kasutata hävitajat pythonis nii palju, kui seda kasutatakse Java, C ++. Mõiste jääb siiski samaks. Programmides kasutamise mõned eelised:
- Vajalikud objektid kustutatakse automaatselt. See vabastab mäluruumi, mida tuntakse prügikogumisena.
- Eeliseks on ka asjaolu, et see käivitub automaatselt.
Teatud toimingud, millest tuleks hävitaja kasutamise ajal hoolitseda:
1. Python ei tea, millises järjekorras hävitatakse objektid, mis saavad üksteisele ümmargusi viiteid hoida. Seetõttu soovitavad inimesed pärast iga funktsiooni kasutada sõnaselgelt suletut. Kuid erandite korral on lähedase meetodi haldamine tülikas. Seetõttu on destruktorite kasutamine tsüklilisi viiteid silmas pidades parem.
2. Tsüklilised viited, kui seda ei käsitleta hästi, on tõenäoline abstraktsioonide lekitamine ja halb kujundus.
Parim on see: ressursse peaks haldama klassi madalaima taseme objekt.
3. Kui kellelgi on hädasti vaja kasutada tsüklilisi viiteid objektide keerulises koodis, pakub Python sellele head lahendust mooduli nime kujul: nõrkref. See tähendab, et referentsile antakse nõrgad viited, mis lõppkokkuvõttes aitab vahemälu rakendada ja ei hoia enam suurt objekti elus. Kui suur objekt pole elus, tähendab see, et see kuvatakse vahemälus.
Vaatame seda väikese koodi kaudu, et saada selget mõistmist:
Kood:
import weakref
class C:
def method(self):
print("Hi!method called!")
c = C()
r = weakref.ref(c)
print(c)
print(r)
Väljund:
Nagu võib näha „r”, on nõrk viide objektile „c”.
Kui teeme meetodi viitega r-le, näiteks c2 = r (). Siis peaksid c ja c2 olema samad, kuna viitavad samale. Vaadake allolevat näidet:
Põhiobjekti kustutamise korral kaotab referentsobjekt oma olemasolu. Vaadake allolevat näidet:
Nagu võib märgata, on printimise (r ()) tulemuseks "Puudub". Sellisel juhul:
gc.collect () annab tulemuseks 0.
4. __del__ ei tohiks segamini ajada pythoniga. __del__ on klassi spetsiaalne meetod, mis on hävitaja ja „del” kasutatakse pythoni keskkonnas määratletud muutuja hävitamiseks. Mõlemad on kaks täiesti erinevat asja.
Nagu:
xx = 10
del xx
Järeldus
Pärast ülaltoodud sisu läbimist võime öelda, et konstruktorid ja destruktorid on Pythoni oluline osa. Destructor mängib mälu haldamisel pöördelist rolli, kus ta täidab programmeerimisel kasutatavate objektide puhastamise palju ülesandeid. Väikeste programmidega tegelemine ei pruugi anda teile hävitajate kasutamise tegelikku pilti. Tootmistaseme programmide või mis tahes keeruliste koodiridadega tegelemisel saab destruktorite olulisusest siiski selgelt aru, kuna mälukasutus muutub seal väga oluliseks. Tsüklilise viite ideed silmas pidades võib hävitajatega töötades tingimata saavutada hea disaini.
Soovitatavad artiklid
See on juhend Destructorile Pythonis. Siin käsitleme süntaksi, eeliseid koos pütoni hävitaja erinevate näidetega. Lisateabe saamiseks võite vaadata ka järgmisi artikleid -
- Abstraktne klass Pythonis
- Pythoni toimetajad
- Python Break avaldus
- Vahetus Pythonis
- Näited vahetamisest PHP-s
- Break avaldus JavaScriptis
- PHP hävitaja täielik juhend näidetega