Как я могу использовать классы в Python 3 для повышения функциональности моей программы? - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь написать простую программу на Python (используя эту обертку: https://github.com/gotthardp/python-mercuryapi), которая может хранить свойства rfid. Я сделал это успешно, используя словарь, но я хотел бы создать свой собственный класс, чтобы я мог добавить больше информации в класс, а не просто ключ и значение, как в случае со словарем Python. В качестве «ключа» используется тег epc (электронный код продукта), а используется значение rssi (сила сигнала) в качестве «значения» в словаре.

Это мой код, таким образом:


# Importing modules
from __future__ import print_function
import time
import mercury

# Variables
protocol = "GEN2"
region  = "EU3"
reader_power = 2000
count = 0
all_reads = {}
final_reads = []

# Trying different USB connections for the RFID-reader, gives an error if nothing is found
try:
    reader = mercury.Reader("tmr:///dev/ttyACM1", baudrate=115200)
except TypeError:
    try:
        reader = mercury.Reader("tmr:///dev/ttyACM0", baudrate=115200)
    except TypeError:
        reader = mercury.Reader("tmr:///dev/ttyAMA0", baudrate=115200)
    except:
        raise TypeError('RFID-reader not found, check ls /dev/')

def test_func(tag):
    if str(tag.epc) not in all_reads.keys():
        all_reads[str(tag.epc)] = int(tag.rssi)

    else:
        if int(tag.rssi) > all_reads[str(tag.epc)]:
            print("should update for epc = ", tag.epc, "old rssi = ", all_reads[str(tag.epc)], "with new rssi = ", tag.rssi)
            all_reads.update({str(tag.epc): int(tag.rssi)})

# Mandatory sets for the reader
reader.set_region(region) # Setting the correct region
reader.set_read_powers([1, 2], [reader_power, reader_power]) # Setting the reader power
reader.set_read_plan([1, 2], protocol) # Setting the correct  RFID-reading protocol

#Start rfid Reading
reader.start_reading(lambda tag: test_func(tag))
time.sleep(5)
reader.stop_reading()
print(all_reads)

Большинство частей кода на самом деле не так интересны, они просто обязательные части, чтобы rfid-reader мог функционировать. Как импорт правильных библиотек, попытка подключения к правильному USB-устройству и т. Д. Определение функции: test_func (tag) - это место, где логика действительно начинается. Сначала проверяется, доступен ли вновь прочитанный epc в качестве ключа в словаре all_reads. Если он недоступен, то epc добавляется в качестве ключа в сочетании со значением rssi в качестве значения для словаря. Если epc уже есть в словаре, то программа проверяет, найдено ли новое лучшее значение rssi, и обновляет словарь, если это так. Это выводит что-то вроде:

should update for epc =  b'E20000000000000000000003' old rssi =  -46 with new rssi =  -45
should update for epc =  b'E20000000000000000000000' old rssi =  -50 with new rssi =  -49
should update for epc =  b'E20000000000000000000002' old rssi =  -41 with new rssi =  -40
should update for epc =  b'E20000000000000000000001' old rssi =  -36 with new rssi =  -35
should update for epc =  b'E20000000000000000000000' old rssi =  -49 with new rssi =  -47
should update for epc =  b'E20000000000000000000000' old rssi =  -47 with new rssi =  -43
{"b'E20000000000000000000003'": -45, "b'E20000000000000000000002'": -40, "b'E20000000000000000000000'": -43, "b'E20000000000000000000001'": -35}

Это все работает нормально, вы получаете один объект с отдельным epc с лучшим значением rssi, но я хотел бы иметь возможность добавить больше информации для каждого "ключа" epc. Поэтому я подумал, что решением будет создание моего собственного класса. Я попытался воссоздать ранее описанное поведение кода с помощью собственного класса: это моя попытка сделать это:

class tags:
    def __init__(self, epc, rssi):
        self.epc = epc
        self.rssi = rssi

Как я мог воссоздать поведение с помощью самодельного класса? Хранить классы тегов таким же образом, как со словарем?

Любая помощь очень ценится!

...