[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