2012-02-25 11 views
5

Chciałbym dodać dynamicznie do metody class ... nazwa funkcji również zostanie przekazana dynamicznie.Dodaj metodę do klasy dynamicznie z dekoratorem

Jak mogę to zrobić? Próbowałem w ten sposób

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 

ale jeśli mam zrobić:

print(aClass.__dict__) 

mam

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

zamiast var: .....

mam tej klasy :

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

ja nazwałbym:

D.name() 

i mieć z powrotem self.dimension ale nie wiem name z góry

+7

Pokaż przykład kodu, które mają nadzieję na wykorzystanie dołączyć metodę do klasy. Nie mam pojęcia, jak możesz mieć metodę, którą chcesz dołączyć, ale nie masz dla niej żadnej nazwy. Nie mam też pojęcia, w jaki sposób można oczekiwać, że ta metoda będzie miała jakiś sens dołączenia do klasy, jeśli klasa nie została zaprojektowana z użyciem tej metody. –

+0

zaktualizował opis – fege

Odpowiedz

6

To mój dekorator

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

Jest to metoda próbką

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

To jest sprawdzonym decoreted klasa

@decorator("myfunc") 
class Klass: 
    pass 

Mam nadzieję, że to jest przydatne i co trzeba :)

Powiązane problemy