[python] Problem s metodami

Radek Kaňovský rk na dat.cz
Pátek Únor 17 14:16:43 CET 2006


On Fri, Feb 17, 2006 at 02:03:41PM +0100, Petr Mach wrote:

> >    >>> type(cls.__dict__['method'])
> >    <type 'function'>
> >    >>> type(cls.method)
> >    <type 'instancemethod'>
> >
> >Vyraz cls.method vrati objekt typu instancemethod, v kterem je
> >zapouzdrena prislusna funkce. Jelikoz se zapouzdreni nikde nekesuje,
> >je pri kazdem vyskytu vyrazu `cls.method' vytvoren novy objekt typu
> >instancemethod. Proto pro porovnani pres operator `is' dostavame False.
> 
> Je ale poněkud zvláštní a je potřeba si dát pozor na to, že ten "novy 
> objekt typu instancemethod" má pořád stejné id:
> 
> >>> id(c.m)
> -1208131876
> >>> id(c.m)
> -1208131876
> >>> id(c.m)
> -1208131876
> 
> >>> id(c.m) == id(c.m), c.m is c.m
> (True, False)

   >>> a = cls.method
   >>> id(a)
   -1210444420
   >>> id(cls.method)
   -1210390332

Ve vasem prikladu se naalokuje pamet pro instancemethod a vzapeti
se uvolni, protoze na objekt neni zadna reference. Vysledkem vyrazu
`id(c.m)' je integer s tim, ze v prubehu vypoctu se docasne vytvoril
objekt typu instancemethod, ale jeste pred dokoncenim vyhodnoceni vyrazu
se objekt dealokoval. Tato pamet se znovu pouzije pro novou instanci
v dalsim vyrazu `id(c.m)'. Pokud ovsem jednu instanci ulozime, nove
volani alokuje jiny usek pameti a dostaneme jine id.

Takhle to mometalne funguje v CPython, v Jythonu to muze byt jinak.

Radek Kaňovský



Další informace o konferenci Python