2012-02-25 8 views
5

Avrei aggiunto il metodo a un class dinamicamente ... il nome della funzione passerà anche dinamicamente.aggiungere metodo a una classe dinamicamente con decoratore

Come posso fare? Ho cercato in questo modo

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 

ma se lo faccio:

print(aClass.__dict__) 

devo

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

invece di var: .....

ho questa classe :

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

che definirei:

D.name() 

e hanno di nuovo self.dimension ma non so name in anticipo

+7

mostrano un esempio di codice che si spera di utilizzare per fissare il metodo alla classe. Non ho idea di come potresti avere un metodo che vuoi allegare, ma non di avere alcun tipo di nome per questo. Inoltre non ho idea di come ti aspetti che il metodo abbia un senso per essere associato alla classe, se la classe non è stata progettata con quel metodo in primo luogo. –

+0

ha aggiornato la descrizione – fege

risposta

6

Questo è il mio decoratore

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

Questo è un metodo di campionamento

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

Questa è una classe interamente decorato

@decorator("myfunc") 
class Klass: 
    pass 

Spero che questo sia utile e che cosa avete bisogno :)

Problemi correlati