2017-01-23 3 views
0
class viewer: 

    def setup(func): 
     func() 

    def draw(func): 
     func() 

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

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

Der obige Code ergibt:Python Decorator Albtraum

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 

Meine Frage ist, wie kann ich den Betrachter implementieren, so dass die Variablen im Setup sind in Draw zugänglich definiert ??

+0

Well 'X' ist einfach nicht in den Anwendungsbereich der 'zeichnen'. –

+0

Meine Frage ist, wie kann ich den Viewer so implementieren, dass die im Setup definierten Variablen in draw zugänglich sind ?? –

Antwort

0

Eine Idee - aber es ist eine schlecht Idee, ist eine globale Variable zu definieren:

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

Sie müssen (im Idealfall) set ein Objekt in der Funktion übergeben, die das Attribut, um es, wenn Sie binden Ich will darauf zugreifen, zumindest, das ist es, was ich sehe.

Auch alle Ihre Methoden fehlen das self Argument, das ist wahrscheinlich nicht das, was Sie wollten. Trotzdem verwenden Sie auch <viewer_class>.set anstelle von `.set.

entweder mit einer Instanz und übergeben self um:

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) 

Oder machen die Methoden classmethods und die Klasse übergeben um:

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)