2017-01-23 102 views
0
class viewer: 

    def setup(func): 
     func() 

    def draw(func): 
     func() 

@viewer.setup 
def set(): 
    x = 2017 

@viewer.draw 
def draw(): 
    print(x) 

上述結果的代碼:Python的裝飾噩夢

Traceback (most recent call last): 
    File "test.py", line 13, in <module> 
    @viewer.draw 
    File "test.py", line 7, in draw 
    func() 
    File "test.py", line 15, in draw 
    print(x) 
NameError: name 'x' is not defined 

我的問題是,我怎麼能實現觀衆,使得在設置中定義的變量是平局訪問?

+0

嘛'x'根本就不是在範圍'draw'。 –

+0

我的問題是,我怎麼能實現瀏覽器,使得在設置中定義的變量是平局訪問? –

回答

0

一個想法 - 但它是一個的想法,是定義一個全局變量:

x = None 
class viewer: 

    def setup(func): 
     func() 

    def draw(func): 
     func() 

@viewer.setup 
def set(): 
    global x 
    x = 2017 

@viewer.draw 
def draw(): 
    print(x)
0

您必須(最好)通過結合的屬性,如果你的函數set內的對象希望以後訪問它,至少,這就是我看到你要去的。

而且,所有的方法都缺少self參數,它可能不是你想要的。儘管如此,也可以使用<viewer_class>.set,而不是`.SET。

要麼用一個實例工作,通過周圍self:約

class viewer: 

    def setup(self, func): 
     func(self) 

    def draw(self, func): 
     func(self) 

# make an instance 
view = viewer() 

@view.setup 
def set(obj): 
    obj.x = 2017 

@view.draw 
def draw(obj): 
    print(obj.x) 

或者,使方法classmethods並把類:

class viewer: 

    @classmethod 
    def setup(cls, func): 
     func(cls) 

    @classmethod 
    def draw(cls, func): 
     func(cls) 

view = viewer() 

@viewer.setup 
def set(obj): 
    obj.x = 2017 

@viewer.draw 
def draw(obj): 
    print(obj.x)