So greifen Sie in Kinderdekorateur zu einer Variablen für Elterndekoration zu
Posted: 21 Aug 2025, 22:59
Ich arbeite an einem Dekorateur. Um einen Dupliziercode zu vermeiden, erbe ich einen übergeordneten Dekorateur, der eine nichtlokale Variable definiert hat. Ich bin nicht in der Lage, das genaue Verhalten in meinem Kinderdekorator zu erhalten, da ich diese Variable im Elterndekorator nicht ändern kann. < /P>
def parentDecorator(func):
initial=False
def wrapped(*args,**kwargs):
nonlocal initial
if initial:
print("gettting executed after initial call")
return func(*args,**kwargs)
else:
print("getting executed before initial call")
initial=True
res=func(*args,**kwargs)
return res
return wrapped
def evaluateCondition():
return True
def childDecorator(func):
def wrapped(*args,**kwargs):
if evaluateCondition():
myFunc=parentDecorator(func)
return myFunc(*args,**kwargs)
else:
print("do nothing")
return wrapped
class decoratorTestClass():
def __init__(self):
print('init called')
@childDecorator
def execute(self):
print("Hello from execute function")
dc=decoratorTestClass()
dc.execute() # this should be called before initialized
dc.execute() # this should be called after initialized
< /code>
In beiden Fällen wird die Funktion im Elend -Aufruf im Elterndekorator gedruckt. Wie kann ich das erreichen? Ich kann nichts im Elterndekorator ändern.
def parentDecorator(func):
initial=False
def wrapped(*args,**kwargs):
nonlocal initial
if initial:
print("gettting executed after initial call")
return func(*args,**kwargs)
else:
print("getting executed before initial call")
initial=True
res=func(*args,**kwargs)
return res
return wrapped
def evaluateCondition():
return True
def childDecorator(func):
def wrapped(*args,**kwargs):
if evaluateCondition():
myFunc=parentDecorator(func)
return myFunc(*args,**kwargs)
else:
print("do nothing")
return wrapped
class decoratorTestClass():
def __init__(self):
print('init called')
@childDecorator
def execute(self):
print("Hello from execute function")
dc=decoratorTestClass()
dc.execute() # this should be called before initialized
dc.execute() # this should be called after initialized
< /code>
In beiden Fällen wird die Funktion im Elend -Aufruf im Elterndekorator gedruckt. Wie kann ich das erreichen? Ich kann nichts im Elterndekorator ändern.