[python] ukončení interpretu, zničení objektu

Jan Janech devel na atlas.sk
Neděle Červen 4 23:43:56 CEST 2006


Objekt triedy este nieje odstraneny, ale iba symbol M je nastaveny na
hodnotu None...
Dost zaujimave spravanie, po tom ako som si po dvoch rokoch zvykol, ze v
pythone vsetko ide ako ma :)



class M:

    b = 0

    def __del__(self):

        print "self.class =", self.__class__

        print "M =", M

        print "M2 =", M2



a2 = M()

M2 = M



~~~~~~~~~~~~~
Vystup:
self.class = __main__.M
M = None
M2 = __main__.M

Takze objekt triedy M je referencovany aj premennou M2 aj atributom
self.__class__, ale premenna M obsahuje cuduj sa svete hodnotu None.

Martin Blazik wrote:
> Cusik,
> ja bych chybu vazne nevidel v tom ze pristupuju v destruktoru ke 
> staticke promenne tridy. Problem je v tom, ze Python v nekterych 
> pripadech provedl jiz gc a to tak, ze znicil definici tridy M.
> 
> class M:
>     b = 0
>    
>     def __del__(self):
>         print 'global()', globals()
>         print 'self', self
>         print 'M', M
>         print 'M.b', M.b
> 
> 
> a = M()
> x = M()
> 
> 
> global(): {'a': None, '__builtins__': <module '__builtin__' (built-in)>, 
> '__file__': 'fall.py', 'M': <class __main__.M at 0x40297d4c>, 'x': 
> <__main__.M instance at 0x402a7b0c>, '__name__': '__main__', '__doc__': 
> None}
> self: <__main__.M instance at 0x402a7aec>
> M: __main__.M
> M.b: 0
> global(): {'a': None, '__builtins__': <module '__builtin__' (built-in)>, 
> '__file__': None, 'M': None, 'x': None, '__name__': '__main__', 
> '__doc__': None}
> self: <__main__.M instance at 0x402a7b0c>
> M: None
> Exception exceptions.AttributeError: "'NoneType' object has no attribute 
> 'b'" in <bound method M.__del__ of <__main__.M instance at 0x402a7b0c>> 
> ignored
> 
> V pripade 'x' je videt, ze trida M uz je znicena :-) Tipnul bych si, ze 
> gc odstranuje polozky v nejakem zajimavem sledu a obcas se stane, ze 
> driv uklidi tridu nez vola destruktor jeji instance. Tim padem uz zadna 
> staticka promenna tridy neexistuje. Pokusim se na to jeste podivat v 
> dokumentaci.
> 
> lachtan


Další informace o konferenci Python