C++中operator()()是什么?有什么作用?Python中有等效实现吗?
1 C++
void operator()() 语法说明 1.1 基础功能
这个语法是C++的函数调用运算符重载,实现该运算符的类实例被称为「仿函数/函数对象」,可以像普通函数一样被直接调用。
比如你定义了MoistureSensor s(...)之后,写s()就会执行你重载的operator()里的代码逻辑。
1.2 隐式调用触发逻辑
你没有看到显式调用还能执行,是因为这段代码的实例被传入了std::thread作为线程执行入口:
MoistureSensor sensor(std::chrono::seconds(5), mtx); std::thread work_thread(sensor); // 线程构造时会自动调用sensor的operator(),不需要手动写sensor()
C++线程库的构造逻辑默认会对传入的可调用对象执行调用操作,所以你看不到显式的调用代码。
1.3 适用场景
相比普通函数,仿函数可以自带成员状态,不需要额外传参就能访问类内的所有成员变量/方法,非常适合需要携带上下文的可调用逻辑,比如你这段代码里的传感器阈值、订阅的设备列表、休眠时长等状态,都可以直接在operator()里访问,不需要当参数反复传递。
2 Python等效实现
Python中要实现相同的「类实例可作为可调用对象执行」的逻辑,只需要重写类的__call__方法即可,和C的operator()功能完全一致,也可以直接作为线程入口传入threading.Thread:
对应你C代码的Python实现示例如下:
import threading import time from typing import Set class WaterDevice: def sprinkleWater(self): # 对应原有业务逻辑 pass def pourWater(self): # 对应原有业务逻辑 pass class MoistureSensor: def __init__(self, sleep_time: int, mtx: threading.Lock): self.sleep_time = sleep_time self.mtx = mtx self.devices: Set[WaterDevice] = set() self.min_val = 0 self.max_val = 10 self.threshold = 3 def subscribe(self, device: WaterDevice): self.devices.add(device) # 等效于C++的void operator()() def __call__(self): while True: print("this") with self.mtx: if self.is_air_too_dry(): for p in self.devices: p.sprinkleWater() if self.is_soil_too_dry(): for p in self.devices: p.pourWater() time.sleep(self.sleep_time) def foo(self): pass # 以下是私有方法实现示例 def is_air_too_dry(self) -> bool: return self.get_air_moisture() < self.threshold def is_soil_too_dry(self) -> bool: return self.get_soil_moisture() < self.threshold def get_air_moisture(self) -> int: # 对应原有传感器读数逻辑 return 0 def get_soil_moisture(self) -> int: # 对应原有传感器读数逻辑 return 0
使用逻辑和C++完全对齐,传入线程即可自动执行__call__里的逻辑:
mtx = threading.Lock() sensor = MoistureSensor(sleep_time=5, mtx=mtx) # 订阅设备 dev = WaterDevice() sensor.subscribe(dev) # 启动线程,自动执行__call__方法 t = threading.Thread(target=sensor) t.start()
内容的提问来源于stack exchange,提问作者stiwenparker
相关产品推荐
相关产品推荐

