[英]Iterate Over Instances of a Class in Python
我創建了一個名為 Equipment 的類,我可以向它傳遞描述設備的屬性、監控它的傳感器類型以及傳感器關聯的數據引腳,用於給定的實例。 然后我初始化該類的四個(任意數量)不同的實例,向它們傳遞相關的屬性,並創建一個代表這些實例的變量列表。 從那里,我定義了一個基於 for 循環的函數,它的工作是迭代這些實例,以便我可以使用給定實例的內容遞歸地從它們關聯的傳感器中提取數據。 然而,當我去實現這個時,我收到一個 TypeError 說 Equipment 對象是不可迭代的。
對我來說,這沒有多大意義,因為我已經創建了類的實例,它大概應該存在於內存中的某個地方並且可以使用它們的變量名進行引用。 因此,我真的要求 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)
您的問題是您正在遞歸調用該方法,因此在第二輪中您使用對象本身而不是列表來調用它!
在 for 循環這一行中:
recursiveCheck(equipment)
您正在使用一個 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)
所以回顧一下,您的代碼第一次運行時,它運行正常並且沒有遇到任何錯誤(您可以使用簡單的打印或計數器對其進行事實檢查),當您的代碼轉到 else 語句時會發生故障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, 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)
所以我讓你的函數是非遞歸的,因為如果我不這樣做,它會在運行時變得一團糟,而且可能很難跟蹤它的去向!!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.