在 Python 中迭代 Class 的实例

Iterate Over Instances of a Class in Python

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

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

我目前的理解缺少什么,我怎样才能开始实现我 described/am 的目标?

以下是相关的代码片段:

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)

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

在 for 循环中这一行:

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)

所以我让你的函数成为非递归函数,因为如果我不这样做,它在运行时就会变得一团糟,而且可能很难理解它的去向!!