簡體   English   中英

如何根據名稱檢查 class 的實例是否存在

[英]How to check if an instance of a class exists based on its name

我有一個應用程序可以從傳感器讀取藍牙廣告並做一些事情。

目前,我使用 dict 來管理傳感器實例及其屬性。 我有一堆函數,我調用它們來根據藍牙廣告的細節做一些事情。

我有興趣從 dict 切換到創建名為 Sensors 的 class。 在 class 本身中包含函數/方法將大量清理我的代碼(使其更具可讀性)並讓我更好地添加新功能。

當有新廣告出現時,我要做的第一步是檢查它是否來自我以前見過的傳感器。 這很簡單,使用 dict

newAdvertisement = {"name": "sensor1", "attribute": "value"}
sensor = newAdvertisement['name']
if sensor in sensorDict
    ...

我無法弄清楚如何對 class 的實例執行類似操作。 如果我從廣告中讀取字符串值,我如何檢查是否存在具有該名稱的 class 實例?

我試圖找出一種使用 isInstance 的方法,如下所示:

newAdvertisement = {"name": "sensor1", "attribute": "value"}
sensor = newAdvertisement['name']
if isInstance(sensor, Sensor):
    ...

但是第 2 行將變量 'sensor' 設置為字符串 'sensor1',因此這會檢查該字符串是否是 Sensor 的實例(當然不是)。 我想要檢查是否有一個名為 sensor1 的 Sensor 實例。

我還嘗試創建一個實例列表,如下所示:

sensor1 = Sensor(name='sensor1', attribute='value')
sensor2 = Sensor(name='sensor2', attribute='value')
sensorList = [sensor1, sensor2]

newAdvertisement = {"name": "sensor1", "attribute": "value"}
sensor = newAdvertisement['name']
if sensor in sensorList:
    ...

但同樣,我將字符串“傳感器”與對象列表進行比較,所以它永遠不會存在。

這樣做有意義嗎? 我能干干凈凈嗎? 在這段代碼中擁有我自己的 class 有用嗎?

沒有什么可以自動執行此操作。

您的 class 可以維護所有實例的字典。

import weakref

class Sensor:
    sensor_dict = weakref.WeakValueDictionary()

    def __init__(self, name, attribute)
        self.sensor_dict[name] = self
        self.name = name
        self.attribute = attribute

然后你可以做

if sensor in Sensor.sensor_dict:

我使用了WeakValueDictionary ,因此當Sensor實例被 GC'ed 時,這些元素將被自動刪除。

有很多方法可以實現這一點。 一種是在檢查傳感器是否存在於傳感器列表中時對您的列表執行一些列表理解。

例如:

sensor1 = Sensor(name='sensor1', attribute='value')
sensor2 = Sensor(name='sensor2', attribute='value')
sensorList = [sensor1, sensor2]

newAdvertisement = {"name": "sensor1", "attribute": "value"}
sensor = newAdvertisement['name']
if sensor in [i.name for i in sensorList]:
    ...

另一種方法是覆蓋傳感器 class 中的__eq__方法。

例如:

class Sensor:
    def __init__(self, name, attribute):
        self.name = name
        self.attribute = attribute

    def __eq__(self, other):
        return other == self.name

sensor1 = Sensor(name='sensor1', attribute='value')
sensor2 = Sensor(name='sensor2', attribute='value')

sensorList = [sensor1, sensor2]

if "sensor1" in sensorList:
    print("found")

在上面的示例中,“found”被成功打印,因為當您使用in關鍵字時,python 檢查容器中所有元素的相等性。 由於__eq__方法設置為與傳感器名稱進行比較,因此一旦到達具有該名稱的傳感器,它就會返回 True。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM