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ý _______________________________________________ Python mailing list [email protected] http://www.py.cz/mailman/listinfo/python
