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

Martin Blazik martin.blazik na premiumsms.cz
Neděle Červen 4 09:18:34 CEST 2006


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


slacker napsal(a):
> Jan Martinek wrote:
>>  >> tento program
>>>> class M:
>>>>    b = 0
>>>>    def __del__(self):
>>>>      M.b
>>>>
>>>> a1 = M()
>>>>
>>>> vyhodí výjimku
>>>>
>>>> Exception exceptions.AttributeError: "'NoneType' object has no attribute
>>>> 'b'" in <bound method M.__del__ of <__main__.M instance at
>>>> 0x2aaaaab50a28>> ignored
>>>>
>>> rekl bych ze tam i tak mas chybu v M.__del__
>>>
>> Jakou chybu? Jestli máš na mysli to
>>        M.b
>> tak se domnívám, že to chyba není. Ale nechci se o tom přít, protože i 
>> když ten řádek nahradím
>>
>>        M.b = 0
>>
>> tak to při ukončení programu taky vyhazuje tu výjimku.
>>
>> Zjistil jsem další věc - když kód vepíšu do intepretu, tak při ukončení 
>> výjimku nevyhodí. Zatímco když vytvořím soubor s tímtéž kódem a ten 
>> spustím, tak to výjimku vyhodí. Děje se tak na Linuxu ve verzích
>> Pythonu 2.4.2 i 2.4.3.
>>
>> --
>> Jan Martinek
>> _______________________________________________
>
> Dle meho skromneho nazoru M.b chybou je, ale z jineho duvodu.
> Dovolim si civotat Python reference manual:
>
> Variables defined in the class definition are class variables; they are 
> shared by all instances. To define instance variables, they must be 
> given a value in the __init__() method or in another method. Both class 
> and instance variables are accessible through the notation 
> ``self.name'', and an instance variable hides a class variable with the 
> same name when accessed in this way.
>
> Dulezita je veta "Jak tridni, tak i instancni promenne jsou pristupne 
> pomoci zapisu ''self.jmeno'' ...
>
> Takze, kdyz zmenite M.b na self.b, docilite pozadovaneho efektu.
>
> slacker
>
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
>
>


Další informace o konferenci Python