2014-10-17 81 views
0

我對Python中的裝飾器有些新鮮,並且正在用一個簡單的裝飾器來構造,這應該會檢查我的類的狀態(當一個依賴函數是實際上是第一次要求)。我的問題是,我想讓裝飾功能也瞭解一下自己的一切,並通過實際的功能爲「參數」(?)python:簡單的裝飾器函數的類名稱空間

class myClass(object): 
    __init__(self): 
     self.__isFoo = False 
     self.__baz = 0 

    def doFoo(self): 
     ... 
     self.__isFoo = True 

    def fooInit(self,func): 
     if not self.__isFoo: 
      self.doFoo() 
     return func 

    @property 
    @fooInit 
    def getBaz(self): 
     return self.__baz 

然而,這一次,我得到一個錯誤,

myObj = myClass() 
myObj.getBaz 

~~> TypeError: fooInit() takes exactly 2 arguments (1 given) 

,我有點明白了,因爲它只是 self.fooinit(self.getBaz) 如果我理解正確的裝飾,還是?

所以我現在有點迷路了,我怎樣才能以簡單的方式定義裝飾器,它也知道類命名空間中的其他對象?

+2

可能重複://計算器.com/questions/4923706/decorating-a-class-method-after-property) – aruisdante 2014-10-17 15:45:09

+0

這實際上與你裝飾物業的事實有關。查看鏈接的副本。 – aruisdante 2014-10-17 15:45:28

+1

並且記住,你對裝飾器的參數實際上是''(func,* args,** kwargs)'',其中''args [0]''將會是'self''。一般來說,[裝飾器函數](http://simeonfranklin.com/blog/2012/jul/1/python-decorators-in-12-steps/)本身沒有被定義爲類名稱空間的一部分。 – aruisdante 2014-10-17 15:47:34

回答

0

以下@ aruisdante的建議,我得到了一個適當的裝飾工作

def fooInit(func): 
    def _wrapped(self,*args, **kwargs): 
     if not self.__isFoo: 
      self.fooInit() 
      return func(self,*args, **kwargs) 
    return _wrapped 

(我的類中定義)裝飾一類方法@property後(HTTP的