在Python中迭代类的实例

2024-07-02 13:28:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经创建了一个名为Equipment的类,我可以将描述设备、监控设备的传感器类型以及传感器关联的数据管脚的属性传递给该类,用于给定的实例化。然后初始化该类的四个(任意数量)不同实例,向它们传递相关的属性,并创建表示这些实例的变量列表。在此基础上,我定义了一个基于for循环的函数,其任务是迭代这些实例,以便我可以使用给定实例的内容递归地从它们相关的传感器中提取数据。然而,当我去实现它时,我收到一个TypeError,说设备对象是不可移植的

对我来说,这没有多大意义,因为我已经创建了类的实例,这些实例应该存在于内存中的某个地方,并且可以使用它们的变量名进行引用。因此,我实际上是在要求Python迭代一个列表对象,该对象包含对给定类实例的引用,这不应该要求类本身是可移植的。相反,根据我的理解,这应该允许引用特定实例,并检索其属性

在我目前的理解中,我遗漏了什么?我如何开始着手实现我所描述的/我的目标

以下是相关的代码片段:

class Equipment:

    def __init__(self, equipmentType, sensor, pin):
        self.equipmentType = equipmentType
        self.sensor = sensor
        self.pin = pin       

dht11Sensor = Adafruit_DHT.DHT11

minus20 = Equipment("Minus 20 Freezer", dht11Sensor, 4)
minus80 = Equipment("Minus 80 Freezer", dht11Sensor, 4)
incubator24 = Equipment("24 Degree Incubator", dht11Sensor, 4)
incubator18 = Equipment("18 Degree Incubator", dht11Sensor, 4)

equipment = [minus20, minus80, incubator24, incubator18]

def recursiveCheck(equipmentList):

    for equipment in equipmentList:
        humidity, temperature = Adafruit_DHT.read(equipment.sensor, equipment.pin)

        if humidity is not None and temperature is not None:
            print(f"Your {equipment.equipmentType} is currently {temperature} degrees C and the humidity is {humidity}%")

        else:
            recursiveCheck(equipment)

    time.sleep(5)
    recursiveCheck(equipmentList)

recursiveCheck(equipment)

Tags: 对象实例self属性ispin传感器sensor
1条回答
网友
1楼 · 发布于 2024-07-02 13:28:25

您的问题是,您正在递归地调用该方法,因此在第二轮中,您将使用对象本身而不是列表来调用它

在该行的循环中:

recursiveCheck(equipment)

您正在使用一个设备对象调用函数,当它运行时,它会尝试在此对象(不是您的列表)上执行for循环! 您可能希望代码如下所示:

class Equipment:

    def __init__(self, equipmentType, sensor, pin):
        self.equipmentType = equipmentType
        self.sensor = sensor
        self.pin = pin       

dht11Sensor = Adafruit_DHT.DHT11

minus20 = Equipment("Minus 20 Freezer", dht11Sensor, 4)
minus80 = Equipment("Minus 80 Freezer", dht11Sensor, 4)
incubator24 = Equipment("24 Degree Incubator", dht11Sensor, 4)
incubator18 = Equipment("18 Degree Incubator", dht11Sensor, 4)

equipment = [minus20, minus80, incubator24, incubator18]

def recursiveCheck(equipmentList):

    for equipment in equipmentList:
        humidity, temperature = Adafruit_DHT.read(equipment.sensor, equipment.pin)

        if humidity is not None and temperature is not None:
            print(f"Your {equipment.equipmentType} is currently {temperature} degrees C and the humidity is {humidity}%")

        else:
            recursiveCheck(equipmentList)

    time.sleep(5)
    recursiveCheck(equipmentList)

recursiveCheck(equipment)

总而言之,当您的代码第一次运行时,它运行正常并且没有遇到任何错误(您可以使用简单的打印或计数器进行检查),当您的代码转到for循环中的else语句时,就会发生故障,因为您试图传递的是对象而不是列表

=== 更新:

因此,如果要在给定索引失败时从该索引启动列表,可以执行以下操作:

class Equipment:

    def __init__(self, equipmentType, sensor, pin):
        self.equipmentType = equipmentType
        self.sensor = sensor
        self.pin = pin       

dht11Sensor = Adafruit_DHT.DHT11

minus20 = Equipment("Minus 20 Freezer", dht11Sensor, 4)
minus80 = Equipment("Minus 80 Freezer", dht11Sensor, 4)
incubator24 = Equipment("24 Degree Incubator", dht11Sensor, 4)
incubator18 = Equipment("18 Degree Incubator", dht11Sensor, 4)

equipment = [minus20, minus80, incubator24, incubator18]

def recursiveCheck(equipmentList, index=0):

    for i in in range(index, len(equipmentList)):
        equipment = equipmentList[i]
        humidity, temperature = Adafruit_DHT.read(equipment.sensor, equipment.pin)

        if humidity is not None and temperature is not None:
            print(f"Your {equipment.equipmentType} is currently {temperature} degrees C and the humidity is {humidity}%")

        else:
            recursiveCheck(equipmentList, i)
            return;

while True:
    recursiveCheck(equipment)
    time.sleep(5)

所以我把你的函数变成了非递归函数,因为如果我不这样做的话,它在运行时会变得一团糟,而且它可能很难跟踪它的去向

相关问题 更多 >