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

Petr Messner petr.messner na gmail.com
Úterý Duben 20 10:55:14 CEST 2010


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 <302302 na 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 na py.cz
> http://www.py.cz/mailman/listinfo/python
>


Další informace o konferenci Python