Existuje jiný způsob, než změna typu za běhu:

class A:
    def b(self, x):
        self.x = x
    def c(self):
        return self.x

a = A()
a.b(42)
assert  a.x == 42

class Proxy:
    def __init__(self, obj):
        self.__dict__["_obj"] = obj
    def __getattr__(self, name):
        return getattr(self._obj, name)
    def __setattr__(self, name, value):
        return setattr(self._obj, name, value)

class A2 (Proxy):
    def b(self, x):
        self.x = x+1

a = A2(a)
a.b(42)
assert a.x == 43
assert a.x == a.c()  # dukaz, ze se to priradi skutecne objektu tridy A


Schválně, co to je - já myslím, že je to návrhový vzor dekorátor :)

Nevýhoda je v tom, že když se takto vytvoří delší řetěz objektů, stoupá režie.

Nebo pokud opravdu chcete mít takto dynamický objekt, možná by bylo
lepší nepoužívat přímo Python objekt, ale naimplementovat si ho
vlastními silami pomocí slovníku a obalu, který při zavolání metody
vezme funkci ze slovníku (klíčem je název) a zavolá ji se sebou samým
jako první parametr té funkce.

PM

2010/4/20 302302 <302...@centrum.cz>:
>
> 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

Odpovedet emailem