新手编程求助:类中temp_c变量未定义及温度监控程序整合问题
嘿,刚接触面向对象编程的时候,踩变量作用域的坑太正常了!你遇到的temp_c未定义错误,核心原因是类的方法里的局部变量没法被其他方法访问——如果不在变量前加self.,它就只是当前方法里的“临时变量”,别的方法根本找不到它。咱们直接用符合你需求的完整代码来拆解,一步步搞懂怎么整合:
核心思路
你的需求是:先让用户设置目标温度 → 后台循环读取传感器温度 → 对比两者。那我们可以把这些逻辑封装到一个类里,用self.前缀来共享变量(比如目标温度、当前传感器温度、循环控制标志),再用线程实现后台运行的循环。
完整示例代码
import time import threading import random # 用来模拟传感器温度,实际使用时替换成你的传感器代码 class TemperatureController: def __init__(self): # 初始化类的实例变量,所有方法都能访问 self.target_temp = None # 目标温度,初始为None self.running = False # 控制监控循环的标志 def set_target_temp(self): """让用户输入目标温度,做简单的输入验证""" while True: try: user_input = input("请输入目标温度(浮点型):") self.target_temp = float(user_input) print(f"目标温度已设置为:{self.target_temp}℃") break except ValueError: print("输入无效,请输入一个数字(比如25.5)!") def read_sensor_temp(self): """模拟读取温度传感器的温度,实际使用时替换成你的传感器代码""" # 这里用随机数模拟,你需要替换成真实的传感器读取逻辑 temp_c = round(random.uniform(20.0, 30.0), 1) return temp_c def _monitor_temperature(self): """后台运行的温度监控循环(内部方法,用下划线标记)""" print("温度监控已启动,后台运行中...") while self.running: current_temp = self.read_sensor_temp() print(f"当前传感器温度:{current_temp}℃") # 对比目标温度和当前温度 if self.target_temp is not None: if current_temp > self.target_temp: print(f"⚠ 当前温度高于目标温度{self.target_temp}℃") elif current_temp < self.target_temp: print(f"⚠ 当前温度低于目标温度{self.target_temp}℃") else: print(f"✅ 当前温度等于目标温度{self.target_temp}℃") time.sleep(1) # 每秒读取一次,可根据需求调整 def start_monitoring(self): """启动后台温度监控""" if self.target_temp is None: print("请先设置目标温度!") return self.running = True # 把监控循环放到子线程,避免阻塞主线程 self.monitor_thread = threading.Thread(target=self._monitor_temperature) self.monitor_thread.daemon = True # 主线程结束时子线程也自动结束 self.monitor_thread.start() def stop_monitoring(self): """停止温度监控""" self.running = False if hasattr(self, 'monitor_thread'): self.monitor_thread.join() print("温度监控已停止") # 程序入口 if __name__ == "__main__": controller = TemperatureController() # 第一步:设置目标温度 controller.set_target_temp() # 第二步:启动后台监控 controller.start_monitoring() # 这里可以加其他逻辑,比如让用户输入指令停止监控 try: while True: user_cmd = input("输入'stop'可停止监控:") if user_cmd.lower() == 'stop': controller.stop_monitoring() break except KeyboardInterrupt: controller.stop_monitoring() print("\n程序已退出")
关键细节解释
为什么用
self.?
比如self.target_temp,它是类的实例变量,所有属于这个实例的方法(set_target_temp、_monitor_temperature等)都能访问和修改它。如果之前你在方法里写的是target_temp = ...,那它只是这个方法的局部变量,其他方法根本看不到,自然会提示未定义。后台运行的实现
直接写while True循环会卡住主线程,所以用threading.Thread把监控逻辑放到子线程里,这样主线程还能处理用户输入(比如停止指令),符合你“后台运行”的需求。输入验证
set_target_temp里的try-except是为了防止用户输入非数字内容导致程序崩溃,新手写程序时记得加这类基础的容错逻辑。模拟传感器代码
read_sensor_temp里的随机数是模拟用的,你只需要把这部分替换成你真实的传感器读取代码(比如从GPIO读取、调用传感器库等),返回浮点型的温度值就行。
测试方法
运行代码后,先输入目标温度(比如25.0),然后程序会每秒打印当前传感器温度和对比结果,输入stop就能停止监控。
内容的提问来源于stack exchange,提问作者Plad Ka

