[python] Problem s metodami

Petr Prikryl PrikrylP na skil.cz
Pátek Únor 17 11:13:02 CET 2006


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



Další informace o konferenci Python