[python] Záměna funkce v instanci objektu

Hynek Fabian hynek.fabian na firma.seznam.cz
Úterý Duben 20 14:17:57 CEST 2010


Ještě jsem na to koukal a zjistil jsem zajimavou věc.
MethodType a UnboundMethodType jsou tentýž objekt,
čili vázané a odvázané metody jsou na oko stejného typu.
Typ zkonstruované metody závisí na argumentech:

MethodType(funkce, instance)     # vrátí vázanou metodu
MethodType(funkce, None, třída)  # vrátí odvázanou metodu

Když se použije jak instance, tak třída, výsledek je vázaná metoda.


Hynek Fabian (úterý 20 Duben 2010 11:10:20):
> 302302 (úterý 20 Duben 2010 09:56:14):
> > Ano, mělo by to být dynamické. A vaše řešení se mi líbí. Jenom nechápu
> > proč to nelze udělat tím prostým přiřazením? Co se tedy vlastně stane,
> > když do metody nějakého objektu přiřadím novou funkci?
> 
> "do metody" nic nepřiřadíš, jen nahradíš jeden objekt ve jmenném prostoru
> instance jiným - v daném případě obyčejnou funkcí. Jeden způsob je vázat ji
> ručně:
> 
> class C: pass
> c = C()
> def a(self): pass
> c.(a)
> 
> Pokud chceš jen předávat někam jednu metodu, může být jednodušší ji svázat
> ručne:
> 
> b = lambda: a(c)
> 
> Je to jen kosmetická úprava proti ručnímu svázání a je to funkčně zcela
> shodné s opravdovou metodou objektu.
> Pokud chceš opravdovou vázanou metodu, můžeš si ji vyrobit:
> 
> import types
> b = types.MethodType(a, c, C)
> c.b = b
> 
> b() bude nadále dostávat jako první argument instanci c
> Mezi voláním b() a c.b() není žádný rozdíl, totéž platí pro konstrukci s
> lambdou. Ta je sice jiného typu (LambdaType vs. MethodType) ale dělá totéž,
> metody se v pythonu od funkcí ničím jiným neliší.
> 
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python


Další informace o konferenci Python