स्टैटिक लोकल वेरिएबल वाले फंक्शन को बनाने के बजाय, आप हमेशा एक "फंक्शन ऑब्जेक्ट" कहलाने वाले को बना सकते हैं और इसे एक स्टैंडर्ड (नॉन-स्टैटिक) मेंबर वेरिएबल दे सकते हैं।
चूँकि आपने C ++ लिखा हुआ एक उदाहरण दिया है, इसलिए मैं पहले बताऊंगा कि C ++ में "फ़ंक्शन ऑब्जेक्ट" क्या है। एक "फ़ंक्शन ऑब्जेक्ट" एक अतिभारित के साथ बस किसी भी वर्ग है operator()। कक्षा के उदाहरण कार्य की तरह व्यवहार करेंगे। उदाहरण के लिए, आप लिख सकते हैं, int x = square(5);भले ही squareकोई वस्तु हो (अतिभारित operator()) और तकनीकी रूप से "फ़ंक्शन" नहीं है। आप फ़ंक्शन-ऑब्जेक्ट में से कोई भी सुविधा दे सकते हैं जिसे आप क्लास ऑब्जेक्ट दे सकते हैं।
# C++ function object
class Foo_class {
private:
int counter;
public:
Foo_class() {
counter = 0;
}
void operator() () {
counter++;
printf("counter is %d\n", counter);
}
};
Foo_class foo;
पायथन में, हम यह भी अधिभार कर सकते हैं operator()सिवाय इसके कि विधि को नाम दिया गया है __call__:
यहाँ एक वर्ग परिभाषा है:
class Foo_class:
def __init__(self): # __init__ is similair to a C++ class constructor
self.counter = 0
# self.counter is like a static member
# variable of a function named "foo"
def __call__(self): # overload operator()
self.counter += 1
print("counter is %d" % self.counter);
foo = Foo_class() # call the constructor
यहां कक्षा का एक उदाहरण दिया जा रहा है:
from foo import foo
for i in range(0, 5):
foo() # function call
कंसोल पर मुद्रित आउटपुट है:
counter is 1
counter is 2
counter is 3
counter is 4
counter is 5
यदि आप चाहते हैं कि आपका कार्य इनपुट तर्कों को ले जाए, तो आप उन्हें भी जोड़ सकते हैं __call__:
# FILE: foo.py - - - - - - - - - - - - - - - - - - - - - - - - -
class Foo_class:
def __init__(self):
self.counter = 0
def __call__(self, x, y, z): # overload operator()
self.counter += 1
print("counter is %d" % self.counter);
print("x, y, z, are %d, %d, %d" % (x, y, z));
foo = Foo_class() # call the constructor
# FILE: main.py - - - - - - - - - - - - - - - - - - - - - - - - - - - -
from foo import foo
for i in range(0, 5):
foo(7, 8, 9) # function call
# Console Output - - - - - - - - - - - - - - - - - - - - - - - - - -
counter is 1
x, y, z, are 7, 8, 9
counter is 2
x, y, z, are 7, 8, 9
counter is 3
x, y, z, are 7, 8, 9
counter is 4
x, y, z, are 7, 8, 9
counter is 5
x, y, z, are 7, 8, 9
_उपसर्ग के बजाय एक वर्ग या मॉड्यूल वैश्विक चर का उपयोग करने का सुझाव दूंगा।