Kann man innerhalb eines Dekorators auf Funktionsattribute zugreifen? Betrachten Sie unter Stück Code.Zugreifen auf Funktionsattribute in Dekoratoren
def deco(a):
def wrap():
print(a.status)
a()
print(a.status)
return wrap
@deco
def fun1():
fun1.status="bar"
fun1.status="foo"
fun1()
erwartete ich die Ausgabe zu sein:
foo
bar
Aber ich bekomme die folgenden Fehler:
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
fun1()
File "D:\python_projects\test_suite\func_attribute.py", line 3, in wrap
print(a.status)
AttributeError: 'function' object has no attribute 'status'
Gibt es eine Möglichkeit, diese Arbeit zu machen, da
def fun1():
fun1.status="bar"
fun1.status="foo"
a=fun1
print(a.status)
a()
print(a.status)
Ausgänge:
foo
bar
Wie erwartet.
def deco (a): def wickeln(): print (fun1
Sie das gleiche Objekt wie
fun1
in der Dekorateur alswrap
zugreifen können. Status) a() drucken (fun1.status) zurückspulen @deco def fun1(): fun1.status = "bar" fun1.status = "foo" fun1() –der obige Code funktioniert auch. Interessant –
@SudhanNadar: Ja, weil Sie dann den globalen Namen 'fun1' referenzieren, auf den der Dekorateur abzielte. Aber jetzt bist du an diese * eine Funktion gebunden, die du geschmückt hast *, du kannst den Dekorator nicht für eine andere Funktion 'fun2' verwenden und erwarten, dass du Zugriff auf die Attribute dieses zweiten Funktionsobjekts erhältst, wenn du es aufruft. 'wrap' wird immer der richtige Bezug zum Dekorationsergebnis sein. –