使用OOP开发树莓派模拟输入函数时遇self参数缺失错误
解决树莓派模拟输入读取类的TypeError问题
错误原因分析
出现TypeError: through_ads1015() missing 1 required positional argument: 'self'的核心问题有两个:
- 类的构造方法
__init__未定义self参数,这是Python类实例方法的必传参数,用于指代实例自身 - 直接通过类名调用实例方法
through_ads1015,未先创建类的实例对象
同时代码存在两处冗余/不合理设计:
- 每次调用
through_ads1015时重复创建ADS1015实例,没必要重复初始化硬件对象 r1 = r1、r2 = r2属于无效赋值,可直接删除
修正后的代码
import Adafruit_ADS1x15 as ada_adc class RaspberryPiAnalogReader: # 类名遵循PEP8大驼峰命名规范 def __init__(self): # 构造方法必须包含self参数 # 初始化时创建一次ADS1015实例,复用硬件对象 self.adc = ada_adc.ADS1015() def read_through_ads1015(self, adc_gain=1, r1=1, r2=0): # 读取A0引脚的原始模拟值 a0_level = self.adc.read_adc(0, gain=adc_gain) print(a0_level) # 转换为ADS1015对应电压值 a0_analog = a0_level * (4.096 / 2047) print(a0_analog) # 计算分压电路下的传感器实际输入电压 a0_sensor = a0_analog * (r1 + r2) / r1 print(a0_sensor) # 返回计算结果,方便后续业务逻辑使用 return a0_sensor
正确调用方式
# 先创建类的实例对象 analog_reader = RaspberryPiAnalogReader() # 通过实例调用方法 analog_reader.read_through_ads1015(adc_gain=1, r1=5.1, r2=3)
补充说明
- Python类的所有实例方法,第一个参数必须是
self,用于绑定实例与方法的关联 - 硬件操作场景下,通过实例管理硬件对象是更合理的设计,能避免重复初始化硬件带来的资源浪费
- 如果确实需要无需实例即可调用的方法,可使用
@staticmethod或@classmethod装饰器,但不适合本场景的硬件操作
内容的提问来源于stack exchange,提问作者Mainland
相关产品推荐
相关产品推荐

