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

Přikryl Petr prikryl na atlas.cz
Úterý Duben 20 10:46:28 CEST 2010


Czenek napsal
> 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?

Zkus tenhle kód (tedy hlavně poslední tři řádky):

class tridaA:
    def b(self, x):
        self.x = x

def c(self, x):
    self.x = x + 1

a = tridaA()
print type(a.b)

a.b = c
print type(a.b)

Vypíše to:

<type 'instancemethod'>
<type 'function'>

To znamená, že nejdříve bylo a.b metodou instance,
ale po přiřazení je to obyčejná funkce.

a.b je jen jméno. Původně ukazuje na objekt metody.
To znamená, že se taky jako metoda používá.

Po přiřazení se jméno a.b použije pro jiné účely.
Je pak spojeno s odkazem na obyčejnou funkci.
Že se zrovna první parametr jmenuje self není
vůbec podstatné. Dokonce i u metod je toto jméno
jen konvencí.

Něco jiného je, kdybys za běhu potřeboval přehazovat
jen metody stejné třídy. Zkus tohle:

class tridaA:
    def __init__(self):
        self.m = self.b
        
    def b(self, x):
        self.x = x

    def c(self, x):
        self.x = x + 1


a = tridaA()
a.m(1)
print a.x

a.m = a.c
a.m(3)
print a.x

Volá se pokaždé a.m, ale ta pokaždé dělá něco jiného.

pepr


Další informace o konferenci Python