2012-02-25 11 views
5

Tendría que agregar el método a un class dinámicamente ... el nombre de la función también se pasará dinámicamente.agregue el método a una clase dinámicamente con el decorador

¿Cómo puedo hacer? He intentado de esta manera

def decor(*var): 
    def onDecorator(aClass): 
    class onInstance: 
     def __init__(self,*args,**kargs): 
      setter=var 
      aClass.setter = self.flam 
      self.wrapped = aClass(*args,**kargs) 

     def __getattr__(self,attr): 
      return getattr(self.wrapped,attr) 

     def __setattr__(self,attr,value): 
      if attr == 'wrapped': 
       self.__dict__[attr]=value 
      else: 
       setattr(self.wrapped,attr,value) 

     def flam(self,*args): 
      self.__setattr__('dimension',len(args[0])) 

    return onInstance 
return onDecorator 

pero si lo hago:

print(aClass.__dict__) 

tengo

'setter': <bound method onInstance.flam of <__main__.onInstance object at 0x522270>> 

en lugar de var: .....

tengo esta clase :

class D: 
    def __init__(self, data): 
    self.data = data 
    self.dimension = len(self.data) 

yo llamaría:

D.name() 

y tienen vuelta self.dimension pero yo no sé de antemano name

+7

muestran un ejemplo del código que se espera utilizar para fijar el método a la clase. No tengo idea de cómo podrías tener un método que quieras adjuntar, pero no tener ningún tipo de nombre para él. Tampoco tengo idea de cómo esperas que el método tenga algún sentido para ser adjuntado a la clase, si la clase no fue diseñada con ese método en primer lugar. –

+0

actualizó la descripción – fege

Respuesta

6

Ésta es mi decorador

def decorator(name): 
    def wrapper(K): 
     setattr(K, name, eval(name)) 
     return K 
    return wrapper 

Se trata de un método de muestreo

def myfunc(self): 
    print "Istance class: ", self 

Esta es una clase decoreted

@decorator("myfunc") 
class Klass: 
    pass 

espero que esto es útil y lo que necesito :)

Cuestiones relacionadas