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@py.cz > http://www.py.cz/mailman/listinfo/python > > _______________________________________________ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python