Итерировать по экземплярам класса в Python - PullRequest
0 голосов
/ 20 января 2020

Я создал класс с именем Equipment, которому я могу передавать атрибуты, описывающие единицу оборудования, тип датчика, который его отслеживает, и контакт данных, с которым связан датчик, для данного экземпляра. Затем я инициализирую четыре (произвольное число) разных экземпляров этого класса, передаю им соответствующие атрибуты и создаю список переменных, которые представляют эти экземпляры. Оттуда я определил функцию, основанную на для l oop, чья работа состоит в том, чтобы перебирать эти экземпляры, чтобы я мог рекурсивно извлекать данные из связанных с ними датчиков, используя содержимое данного экземпляра. Однако, когда я go реализую это, я получаю TypeError, говорящую, что объект Equipment не повторяется.

Для меня это не имеет особого смысла, так как я создал экземпляры класса, которые, предположительно, должны где-то существовать в памяти и быть ссылочными, используя их имя переменной. Таким образом, я действительно прошу Python перебрать объект списка, содержащий ссылки на экземпляры данного класса, который не должен требовать повторения самого класса. Скорее, насколько я понимаю, это должно позволять ссылаться на конкретный экземпляр c и извлекать его атрибуты.

Чего мне не хватает в моем текущем понимании, и как я могу начать приближаться к реализации, которая Я описал / нацеливаюсь на?

Вот соответствующие фрагменты кода:

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)

1 Ответ

1 голос
/ 20 января 2020

ваша проблема в том, что вы вызываете метод рекурсивно и, следовательно, во втором раунде вы вызываете его с самим объектом, а не со списком!

в for-l oop этой строке:

recursiveCheck(equipment)

вы вызываете функцию с одним объектом Equipment, и при запуске она пытается выполнить for-l oop для этого объекта, который не входит в ваш список! Вы, вероятно, хотели, чтобы ваш код был таким:

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)

Итак, подытожим: при первом запуске вашего кода он работает нормально и не обнаруживает никаких ошибок (вы можете проверить его с помощью простая печать или счетчик), ошибка возникает, когда ваш код переходит к оператору else в for-l oop, потому что вы пытаетесь передать объект вместо списка!

=== update:

, поэтому, если вы хотите запустить список из заданного индекса, когда он не работает, вы можете сделать это:

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)

, поэтому я сделал вашу функцию нерекурсивной, потому что, если я этого не сделал что во время выполнения это стало бы беспорядком, и, возможно, стало трудно следить за тем, куда он идет !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...