Treba si uvedomit jednu vec
In [1]: class tridaA(object):
...: def b(self, x):
...: self.x = x
...:
...:
In [2]: def c(self, x):
...: self.x = x+1
...:
...:
In [3]: a=tridaA()
In [4]: a.b
Out[4]: <bound method tridaA.b of <__main__.tridaA object at 0x98a850>>
In [5]: a.b = c
In [6]: a.b
Out[6]: <function c at 0x994f50>
Ako vidite, povodne bola a.b "bound method", ktora vie svoje self, a po
novom je a.b "function", teda ziadna metoda a self parameter nema aj ak
ho uvediete v zozname.
Je to kvoli tomu, ze pri priradeni funkcie ako atributu sa automaticky
vytvori objekt typu method. Atributom triedy teda nie je samotna funkcia
ale objekt, ktory funkciu zapuzdruje. Parameter self sa posiela iba metodam.
Neviem o ziadnom jednoduchom sposobe, ako vytvorit plnohodnotnu metodu
na instancii. Samozrejme v pythone nie je nic nemozne, ale asi by to
stratilo nieco na prehladnosti a kus na rychlosti. Takze takym veciam sa
radsej vyhybam.
Jan Janech
302302 wrote:
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?
Czenek
Jan Janech wrote:
Este by som ale rad upozornil, ze pred pouzitim takehoto riesenia si treba
najskor dva krat poriadne premysliet, ci ho naozaj chcem pouzit. Vo vela
pripadoch je to legitimne riesenie, ale casto to znamena, ze nieco nie je v
navrhu v poriadku.
Jan Janech
Popripade, ak to treba spravit dynamicky, tak
a=tridaA()
....
a.__class__ = tridaA2
ak tridaA2 pre nieco neexistuje, da sa spravit:
# c je funkcia, ktora sa ma pouzit ako metoda a.b
a.__class__ = type('tridaA', (tridaA, ), {'b': c})
v tom pripade ale musi byt tridaA definovana ako new-style class, teda musi
dedit po object.
Jan Janech
azurIt wrote:
V pripade, ze ta nova funkcia bude vzdy rovnaka, tak sa toto riesi proste
dedenim:
class tridaA:
def b(self, x):
self.x = x
class tridaA2(tridaA):
def b(self, x):
self.x = x + 1
a=tridaA2()
-----Pôvodná správa-----
Od: 302302 [mailto:302...@centrum.cz]
Komu: python <python@py.cz>
Predmet: [python] Záměna funkce v instanci objektu
Mám nadefinovanou třídu
class tridaA():
def b(self,x):
self.x=x
vytvořím její instanci
a=tridaA()
místo metody b, ale chci, aby se vždy v tomto objektu zavolala funkce c, která
je nadefinována někde mimo:
def c(self, x):
self.x = x+1
Pokud to ale pouze přiřadím a zavolám
a.b=c
a.b(1)
tak se do parametru self automaticky nepřiřazuje daný objekt a.
Jak můžu zaměnit funkce ve vytvořené instanci objektu, aby se to chovalo jako
běžná metoda?
Czenek
_______________________________________________
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
_______________________________________________
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python
____________________________
Ing. Jan Janech
Katedra softverovych technologii
Fakulta riadenia a informatiky
Zilinska Univerzita
_______________________________________________
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python