স্থিতিশীল স্থানীয় ভেরিয়েবলযুক্ত কোনও ফাংশন তৈরির পরিবর্তে, আপনি সর্বদা যা "ফাংশন অবজেক্ট" বলা হয় তা তৈরি করতে পারেন এবং এটি একটি স্ট্যান্ডার্ড (অ-স্থিতিশীল) সদস্য ভেরিয়েবল দিতে পারেন।
আপনি যেহেতু সি ++ লিখিত একটি উদাহরণ দিয়েছেন তাই আমি প্রথমে সি ++ এ "ফাংশন অবজেক্ট" কী তা ব্যাখ্যা করব। একটি "ফাংশন অবজেক্ট" হ'ল অতিরিক্ত লোডযুক্ত কোনও শ্রেণি 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
_
উপসর্গের পরিবর্তে কোনও শ্রেণি বা মডিউল গ্লোবাল ভেরিয়েবলগুলি ব্যবহার করার পরামর্শ দেব ।