2016-10-12 3 views
0

ich Dekorateur mit meinem Python statischer Methode hinzufügen mag, wie folgt vor:Python Dekorateure und statische Methoden

class AdminPanelModel(db.Model): 

    id = db.Column('id', db.Integer, primary_key=True) 
    visible = db.Column(db.Boolean,) 


    def decor_init(func): 
     def func_wrapper(*kargs, **kwargs): 
      for l in model.all(): #internal logic 
       pass 

      return func(*kargs, **kwargs) 

     return func_wrapper 

    @staticmethod 
    @decor_init 
    def all_newscollection_at_adminpanel(): 
     pass 

ich versuchte, indem @staticmethod meinen Dekorateur und versuchten Funktionsaufruf wie folgt func(AdminPanelModel,*kargs, **kwargs), aber kein Glück zu machen, haftete immer noch folgende Fehlermeldung:

TypeError: unbound method func_wrapper() must be called with AdminPanelModel instance as first argument (got nothing instead) 

Gibt es eine Möglichkeit, dass ich das erreichen kann? Ich bin mir bewusst, dass es andere Wege geben kann, die gleiche Arbeit zu leisten, aber es ist eher eine pädagogische Frage, als Dinge irgendwie zu erledigen.

+0

Es tut mir leid, aber wo bekommen Sie 'Modell' für' für l in model.all(): '? Und ich denke, dass Sie Dekorateur innerhalb Ihrer Klasse setzen müssen. –

+0

das war Teil der internen Logik. – sadaf2605

Antwort

2

Sie benötigen einen classmethod stattdessen verwenden:

@classmethod 
@decor_init 
def all_newscollection_at_adminpanel(cls): 
    pass 

Der Aufruf ist die gleiche, aber classmethod s implizit die Klasse als erstes Argument erhalten, die dann auch in der dekorierten Funktion

weitergegeben

um zu sehen, den Unterschied:

class AdminPanelModel(object): 
    def decor_init(func): 
     def func_wrapper(*kargs, **kwargs): 
      print kargs # The first element should be of type class AdminPanelModel 
      return func(*kargs, **kwargs) 

     return func_wrapper 

    @staticmethod 
    @decor_init 
    def staticm(): 
     pass 

    @classmethod 
    @decor_init 
    def classm(cls): 
     pass 

sie liefern

AdminPanelModel.staticm() 
>>>()          # empty, which is reason for error 
AdminPanelModel.classm() 
>>> (<class '__main__.AdminPanelModel'>,) # class instance as first parameter 
+0

und welche Änderungen muss ich an meinem Dekorateur vornehmen? – sadaf2605

+0

Ich glaube, dass Sie nichts ändern müssen. Sehen Sie eine neue Fehlermeldung? –

+0

Danke, ich musste '@ classmethods' vor' @ decorator' setzen, was ich anfangs falsch machte. :) – sadaf2605