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

Hynek Fabian hynek.fabian na firma.seznam.cz
Úterý Duben 20 11:10:20 CEST 2010



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ší.



Další informace o konferenci Python