[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