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@py.cz > http://www.py.cz/mailman/listinfo/python _______________________________________________ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python