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

Jan Martinek honza na dp.fce.vutbr.cz
Neděle Červen 4 09:43:52 CEST 2006


Jan Kundrát wrote:
> Jan Martinek wrote:
>> class M:
>>    b = 10
>>    def __init__(self):
>>      self.b += 1         # což není totéž co self.b.__add__(1)
>>    def __del__(self):
>>      print self.b        # Objekt instance
>>      print M.b           # Objekt třídy
>>
>> a1 = M()
>>
>>
>> by měl vypsat
>>
>> 11
>> 10
>>
>> ale místo toho napíše 11 a pak spadne. Tedy alespoň u mě ;-)
> 
> Nemel by spis vypsat 11 a 11?
> 


Doufám, že nežiju v nějakých bludech, ale podle mě to má opravdu vypsat
11
10
Například tento program

class M:
   b = 10
   def __init__(self):
     print self.b, M.b, id(self.b) == id(M.b)
     self.b = 11
     print self.b, M.b, id(self.b) == id(M.b)

a = M()

Vypíše

10 10 True
11 10 False

Jestliže se odkážu na self.b aniž bych ho předtím inicializoval, tak 
Python tento název nenajde. Nicméně pokračuje dál v prohledávání 
jmenného prostoru, až narazí na M.b. Takže se self.b a M.b jeví jako 
tytéž objekty. Ale jakmile do self.b přiřadím nějakou (jinou) referenci, 
najde se při volání self.b přednostně. A od té chvíle už self.b a M.b 
není totéž.
Pokud se ale pletu, tak mě prosím vyveďte z omylu.

--
Jan Martinek


Další informace o konferenci Python