Python: вызов экземпляра класса вне функции - PullRequest
0 голосов
/ 09 января 2020

Я создаю скрипт для измерений, который я хотел бы привести в порядок для удобства чтения конечными пользователями. Скрипт общается со всеми видами оборудования, которые загружаются как отдельные классы. Для целей этого вопроса я создал фиктивный инструмент, который сохраняется в отдельном файле (как и в случае с реальной программой, которую я создаю):

instruA.py

class instruA:
    def msg(self):
        return 123

Поскольку основной сценарий измерения - файл, который изменяет конечный пользователь - должен быть максимально простым, я создал «лабораторный» модуль, в котором размещаются команды измерения:

lab.py

import sys

meas_dict = {}

def str_to_class(classname):
    return getattr(sys.modules[__name__], classname)

Пользователь может изменить только основной сценарий (показанный ниже), чтобы добавить все устройства, которые он хочет использовать для измерений, после чего сценарии принимают заботиться об остальном. Сценарий для этого вопроса выглядит следующим образом:

main.py

from instruA import *
a = instruA()

# Create a list of devices that needs to be measured 
# (typically: 'a.msg, foo.bar, b.somevariable')
meas_dict = 'a.msg'

# Load lab software        
import lab
lab.meas_dict = meas_dict

# TEST LINE OF CODE (GIVES ERROR):
lab.str_to_class('a')

Я ожидаю, что сценарий укажет мне на нужный объект, то есть <instruA.instruA at 0x1b2ba7d1e80> , Вместо этого он дает module 'lab2' has no attribute 'a'.

Как я могу убедиться, что мой lab.py имеет доступ к экземплярам моего класса?

1 Ответ

0 голосов
/ 09 января 2020

Это неясно, что вы хотите сделать, и трудно угадать структуру ваших файлов. Но там, где у вас есть getattr(str_to_class(dev[0]), dev[1]), вы не получаете правильный ключ из meas_dict.

Я думаю, что если вы измените эту часть так, как это было раньше (в файле lab.py), она будет работать нормально .

Как это:

import sys

meas_dict = {}

def measure(md=None):
    if md is None:
        md = meas_dict

    md = md.split(',')
    for device in md:
        cls = md[dev]['dev'], variable = md[dev]['var']
        meas_cmd = getattr(cls, variable)
        print(meas_cmd())
``
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...