Thay vì tạo một hàm có một biến cục bộ tĩnh, bạn luôn có thể tạo một cái gọi là "đối tượng hàm" và cung cấp cho nó một biến thành viên tiêu chuẩn (không tĩnh).
Vì bạn đã đưa ra một ví dụ viết C ++, trước tiên tôi sẽ giải thích "đối tượng hàm" là gì trong C ++. Một "đối tượng hàm" đơn giản là bất kỳ lớp nào có quá tải operator()
. Trường hợp của lớp sẽ hành xử như các chức năng. Ví dụ: bạn có thể viết int x = square(5);
ngay cả khi square
là một đối tượng (bị quá tải operator()
) và về mặt kỹ thuật không phải là "hàm". Bạn có thể cung cấp cho một đối tượng hàm bất kỳ tính năng nào mà bạn có thể cung cấp cho một đối tượng lớp.
# 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;
Trong Python, chúng ta cũng có thể quá tải operator()
ngoại trừ phương thức được đặt tên thay thế __call__
:
Đây là một định nghĩa lớp:
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
Dưới đây là một ví dụ về lớp đang được sử dụng:
from foo import foo
for i in range(0, 5):
foo() # function call
Đầu ra được in ra bàn điều khiển là:
counter is 1
counter is 2
counter is 3
counter is 4
counter is 5
Nếu bạn muốn hàm của mình nhận các đối số đầu vào, bạn cũng có thể thêm chúng vào __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
_
tiền tố thông thường .