[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