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): > > >>> 'jedna' is 'jedna' > > Dane chovani me ale docela prekvapilo. Pravdepodobne k tomu dojde > pri ziskavani objektu metody na zaklade definice funkcniho objektu > uvnitr tridy.
Potvrzuji pro... Python 2.4.2 (#67, Sep 28 2005, 12:41:11) [MSC v.1310 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. To 'jedna' is 'jedna' vrací pro uvedenou verzi Pythonu True, ale určitě je to věc, na kterou se obecně nedá spolehnout. Při jednodušší implementaci by se řetězec se stejným obsahem mohl vytvořit dvakrát. 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. Jiná situace nastává, když třída definuje svou proměnnou, která udržuje stav. Pak by mělo být zajištěno, že "obj.v is obj.v". Vyzkoušel jsem to, a potvrdilo se to (viz dále). Je to jen takový black-box náhled. >>> class cls(object): ... def method(): pass ... v = 0 ... >>> obj = cls() >>> obj.method == obj.method True >>> obj.method is obj.method False >>> obj.v == obj.v True >>> obj.v is obj.v True pepr _______________________________________________ Python mailing list [email protected] http://www.py.cz/mailman/listinfo/python
