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

slacker slacker na inmail.cz
Sobota Červen 3 22:53:18 CEST 2006


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



Další informace o konferenci Python