[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