distruge obiectul din clasa python (Programare, Python, Clasa, Oop, Obiect, Self)

coderoftheday a intrebat.

Bună ziua, încerc să distrug un obiect de clasă dacă este îndeplinită condiția unei instrucțiuni if (în interiorul unui while)

global variablecheck

class createobject:
        def __init__(self,userinput):
             self.userinput = input
             self.method()
         
        def method(self):
             while True:
                if self.userinput == variablecheck
                     print('the object created using this class is still alive')
                
                 
                 else:
                    print('user object created using class(createobject) is dead')
                    #what code can i put here to delete the object of this class?


Comentarii

  • Nu puteți distruge manual obiectele în Python, Python folosește gestionarea automată a memoriei. Atunci când un obiect nu mai este referit, este liber pentru a fi colectat la gunoi, în CPython, care utilizează numărarea referințelor, atunci când numărul de referințe ajunge la zero, un obiect este recuperat imediat. –  > Por juanpa.arrivillaga.
  • deci dacă creez un alt obiect din această clasă, obiectul actual se va distruge singur? –  > Por coderoftheday.
  • Putem face ca numărul de referințe să fie zero în mod intenționat? doar o curiozitate… –  > Por sam.
  • Nu, nu se va face. Din nou, obiectele sunt efectiv distruse (în CPython, așa funcționează, dar nu este o garanție a limbajului) atunci când nu mai sunt referite. –  > Por juanpa.arrivillaga.
  • @sam în unele cazuri. x = Foo(); del x elimină singura referință la obiectul creat de către Foo(). Cu toate acestea, nu este întotdeauna atât de simplu. Nu puteți manipula în mod direct numărul de referințe (ei bine, aproape orice este posibil dacă vă străduiți suficient de mult, dar aceasta este o rețetă pentru lucruri foarte rele) –  > Por juanpa.arrivillaga.
1 răspunsuri
Oneiros

Gândește-te la asta în felul următor: îi ceri unei clase să se autodistrugă folosind o metodă interioară, ceea ce e ca și cum ai încerca să-ți mănânci propria gură.

Din fericire pentru tine, Python dispune de garbage collection, ceea ce înseamnă că clasa ta va fi distrusă automat odată ce toate referințele sale au ieșit din domeniul de aplicare.

Dacă aveți nevoie să faceți ceva specific atunci când instanța este distrusă, puteți totuși să suprascrieți __del__() care va un fel de acționează ca un destructor. Iată un exemplu prostesc:

class SelfDestruct:
    def __init__(self):
        print("Hi! I'm being instanciated!")
    
    def __del__(self):
        print("I'm being automatically destroyed. Goodbye!")

    def do_stuff(self):
        print("I'm doing some stuff...") 

Acum, încercați să instanțiați această clasă într-un domeniu local (cum ar fi o funcție):

def make_a_suicidal_class():
    my_suicidal_class = SelfDestruct()
    for i in range(5):
        my_suicidal_class.do_stuff()
    return None

Aici, durata de viață a obiectului este limitată de funcție. Ceea ce înseamnă că va fi distrus automat odată ce apelul este finalizat. Astfel, rezultatul ar trebui să arate astfel:

>>> make_suicidal_class()
"Hi! I'm being instanciated!"
"I'm doing some stuff..."
"I'm doing some stuff..."
"I'm doing some stuff..."
"I'm doing some stuff..."
"I'm doing some stuff..."
"I'm being automatically destroyed. Goodbye!"
>>>

Dacă clasa dvs. a fost instanțată într-un domeniu global, atunci nu va fi distrusă până la terminarea programului.

De asemenea, trebuie remarcat faptul că apelarea manuală a funcției __del__() destructor NU distruge de fapt obiectul. Procedând astfel:

foo = SelfDestruct()
foo.__del__()
foo.do_stuff()

Rezultatul este următoarea ieșire:

"Hi! I'm being instanciated!"
"I'm being automatically destroyed. Goodbye!"
"I'm doing some stuff..."

ergo, instanța are încă un puls… Dacă aveți cu adevărat nevoie să împiedicați ca instanța să mai fie menționată din nou în domeniul curent, trebuie să apelați del foo pentru a face acest lucru.

Deși, așa cum s-a afirmat anterior, Python numără de fapt clasele și variabilele prin referință. Deci, dacă obiectul clasei dvs. este utilizat în altă parte, invocarea lui del foo nu îl va elibera de fapt din memorie.

Iată o explicație exhaustivă în documentația pythonhttps://docs.python.org/2.5/ref/customization.html

„del x” nu îl cheamă direct pe x.del() — primul decrementează numărul de referințe pentru x cu unu, iar cel de-al doilea este apelat doar atunci când numărul de referințe al lui x ajunge la zero.

Pe scurt: nu vă gândiți la asta! Lăsați python să se ocupe de gestionarea memoriei. Scopul colectării gunoiului este să nu vă mai faceți griji cu privire la durata de viață a variabilelor dumneavoastră!

Comentarii

  • aveți răbdare cu mine în încercarea de a înțelege acest lucru, vă mulțumesc totuși –  > Por coderoftheday.
  • Noroc! Îmi pare rău dacă explicația mea nu a fost suficient de clară. –  > Por Oneiros.
  • nuo este foarte clar!!!, trebuie doar să îi spun creierului meu să înțeleagă. –  > Por coderoftheday.
  • Și dacă aș vrea un buton doar pentru a omorî clasa chiar dacă este în curs de execuție ? –  > Por coderoftheday.
  • Depinde de implementarea ta, dar din ce am înțeles, o nouă instanță a clasei tale este creată într-un fir separat de fiecare dată când este apăsat un buton. Dacă acesta este un comportament dorit, atunci următoarea postare ar putea fi de ajutor: stackoverflow.com/questions/28127862/… –  > Por Oneiros.