2016-10-12 85 views
0

我要添加裝飾與我的蟒蛇靜態方法,像以下:蟒蛇裝飾和靜態方法

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 

我嘗試添加@staticmethod我的裝飾,試圖使函數調用,比如下面func(AdminPanelModel,*kargs, **kwargs),但沒有運氣,仍然堅持以下錯誤消息:

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

有沒有什麼辦法可以實現這一目標?我意識到可以通過其他方式來完成同樣的工作,但它更像是一個教育問題,而不是以某種方式完成任務。

+0

對不起,但是你在model.all()中獲得'model' for'l的位置?我認爲你需要在你的課堂中放置裝飾器。 –

+0

這是內部邏輯的一部分。 – sadaf2605

回答

2

您需要使用classmethod代替:

@classmethod 
@decor_init 
def all_newscollection_at_adminpanel(cls): 
    pass 

的調用是相同的,但classmethod小號隱含接收類作爲第一個參數,這將隨後也被傳遞到裝飾功能

看出區別:

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 

它們產生

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

以及我需要在裝飾器上進行哪些更改? – sadaf2605

+0

我相信你不需要改變任何東西。您是否看到新的錯誤訊息? –

+0

Thankyou,我需要在'@ decorator'之前放置'@ classmethods',我最初做錯了。 :) – sadaf2605