แทนที่จะสร้างฟังก์ชั่นที่มีตัวแปรสแตติกท้องถิ่นคุณสามารถสร้างสิ่งที่เรียกว่า "ฟังก์ชั่นวัตถุ" และให้มันเป็นสมาชิกมาตรฐาน (ไม่คงที่) ตัวแปรสมาชิก
เนื่องจากคุณให้ตัวอย่างเขียน C ++ ฉันจะอธิบายว่า "function object" ใน C ++ เป็นครั้งแรก A "ฟังก์ชั่นของวัตถุ" 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;
ใน Python เราสามารถโอเวอร์โหลดได้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
_
นำหน้าแบบเดิม