2011-05-25 8 views
12

Cuando hago lo siguiente:añadir dinámicamente función miembro de una instancia de una clase en Python

class C: 
pass 

def f(self): 
print self 

a = C() 

a.f = f 

a.f() 

me sale el siguiente error en la línea af(): TypeError: f() toma exactamente 1 argumento (0 dado)

El problema parece ser que cuando se agrega f a la instancia, a, se trata como una función que está almacenada dentro de una función miembro, en lugar de una función miembro real. Si cambio a.f() a a.f (a), entonces obtengo el efecto deseado, pero ¿hay alguna manera de hacer que python interprete el ejemplo original de esta manera? En otras palabras, ¿hay alguna manera de agregar una función miembro a una instancia de una clase en tiempo de ejecución?

Gracias

Respuesta

18
import types 
class C: 
    pass 

def f(self): 
    print self 

a = C() 
a.f = types.MethodType(f,a) 
a.f() 
+2

Esta es la manera de agregar la función a la instancia específica 'a' (otras instancias de la clase' C' no tendrán 'f'). – Dave

+1

'Cf = types.MethodType (f, None, C)' sería el código para agregar la función a cualquier instancia existente o eventual de la clase C – Julius

1

Usted debe poner f en la clase, no en la instancia ...

class C: 
    pass 

def f(self): 
    print(self) 

a = C() 
C.f = f 
a.f() 

Para el intérprete myObject.foo() es el mismo que myClass.foo(myObject) cuando el objeto no se sostiene cualquier cosa llamada foo, pero una función colocada dentro de un objeto es solo una función.

+0

Esto no funciona – balki

+3

Esta es la forma de agregar la función a todas las instancias de la clase 'C' (y sus subclases). – Dave

Cuestiones relacionadas