[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