[python] Problem s metodami
Radek Kaňovský
rk na dat.cz
Pátek Únor 17 13:20:38 CET 2006
On Fri, Feb 17, 2006 at 11:13:02AM +0100, Petr Prikryl wrote:
> Jan Svec napsal...
> > muze mi nekdo potvrdit nasledujici chovani na nejnovejsi verzi Python
> > (testovano na 2.3.5 a 2.4.1):
> >
> > >>> class cls(object):
> > ... def method(): pass
> > ...
> > >>> obj = cls()
> > >>> obj.method is obj.method # !!!
> > False
> > >>> obj.method == obj.method
> > True
> >
> > Pravdepodobne nejde o chybu, nebot ne vzdy plati treba (ilustrativne):
>
> Logicky vzato, s tím "obj.method is obj.method" je to podobné.
> Metoda samotná neudržuje žádný vnitřní stav a jakákoliv kopie
> kódu bude fungovat stejně. Možná je to chování operátoru is
> implementováno uměle, aby programátoři nikdy nespoléhali na to,
> že kód metody objektu vždy leží na stejném místě. Dovedu si
> třeba představit, že objekt vznikl v distribuovaném nebo
> paralelním prostředí a třída se rozkopírovala mezi více
> procesorů. Vzhledem k tomu, že Python vznikal v souvislosti
> s vývojem jednoho paralelního systému, mohlo se to tady odrazit.
>>> 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.
Radek Kaňovský
Další informace o konferenci Python