क्योंकि पायथन के scoping नियमों का
साथ आवरण समारोह fun2Return
इसे कहते है, एक सजाया समारोह आम तौर पर डेकोरेटर में किसी भी चर का उपयोग नहीं कर सकते हैं।
def funcDec(func):
localVariable = "I'm a local string"
def wrapped(*args):
print("Calling localVariable from funcDec " + localVariable)
func(*args)
print("done with calling f1")
wrapped.attrib = localVariable
return wrapped
@funcDec
def f1(x, y):
print(x + y)
print('f1.attrib: {!r}'.format(f1.attrib))
f1(2, 3)
निम्नलिखित में से कौन उत्पादन का उत्पादन होगा::
Calling localVariable from decorator I'm a local string
5
f1.attrib: "I'm a local string"
done with calling f1
हालांकि, बाद से कार्यों उन्हें सौंपे गए मनमाने ढंग से गुण हो सकता है, आप
डेकोरेटर के बाद ऐसा ही प्रभाव प्राप्त करने के लिए की तरह कुछ कर सकता है
किसी ने पूछा कि क्या इसे कक्षा के तरीकों पर लागू किया जा सकता है: उत्तर "हां" है, लेकिन आपको विधि को संदर्भित करना है कक्षा स्वयं या इसके उदाहरण को self
के रूप में पारित किया गया है तर्क। दोनों तकनीकें नीचे दिखाए गए हैं। self
का उपयोग करना बेहतर है क्योंकि यह उस वर्ग के नाम से स्वतंत्र कोड बनाता है जिसमें यह है।
class Test(object):
@funcDec
def f1(self):
print('{}.f1() called'.format(self.__class__.__name__))
print('self.f1.attrib: {!r}'.format(self.f1.attrib)) # Preferred.
print('Test.f1.attrib: {!r}'.format(Test.f1.attrib)) # Also works.
print()
test = Test()
test.f1()
आउटपुट:
Calling localVariable from funcDec I'm a local string
Test.f1() called
self.f1.attrib: "I'm a local string"
Test.f1.attrib: "I'm a local string"
done with calling f1
भी देखें: http://en.wikipedia.org/wiki/Scope_(computer_science)#Lexical_scoping_and_dynamic_scoping – georg