lesnoy88
@lesnoy88
network engeneer

Как в Python присвоить объекту класс, если имена классов хранятся в списке?

У меня есть список, в котором хранится пары "SNMP SysObjectID" - "Model". Это у меня для внутренних скриптовых нужд:)
Чтобы не плодить всяких разных дублирующих списков - я решил значение, хранящееся в "Model" использовать как имя класса (с большой буквы, без спецсимволов, всё как надо).
Но вот в цикле я никак не могу объекту (в моем случае это ip адрес) присвоить класс. Нет такого метода.
Тоесть, я получаю SysObjectID по SNMP, проверяю в списке по этому SysObjectID значение Model.
И вот объекту как этот результат (значение Model) присвоить в качестве класса?...

Если делать цикл с проверкой что if "Model" == 'Des320026a1' then ip = Des320026a1(), то когда на сети появится новый вендор - надо будет дописывать строки, относящиеся к этому вендору, в двух, а то и трёх местах.
Хотелось бы этого избежать. Потому и имена классов я называл в соответствии со значением "Model".

Как удобней всего динамически присваивать классы?
  • Вопрос задан
  • 89 просмотров
Пригласить эксперта
Ответы на вопрос 3
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Используйте для этого словарь, например.
class One:
    name = 'Class One'

class Two:
    name = 'Class Two'

class Three:
    name = 'Class Three'


if __name__ == '__main__':
    classes = {'One': One, 'Two': Two, 'Three': Three}
    class_names = ['One', 'Three', 'Two']
    my_entities = [classes[class_name] for class_name in class_names]
    
    for entity in my_entities:
        print(entity.name)
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
Например, так.
class KnownClasses:
    # используем статическое поле класса, 
    # так как к нему проще получить доступ из разных модулей
    collection: typing.Dict[str, typing.Type] = {}

class SomeKnownClass:
    ...  # тут тело класса

# регистрируем класс
KnownClasses.collection[SomeKnownClass.__name__] = SomeKnownClass

При желании можно заморочиться дальше, используя метаклассы, и избавиться от необходимости регистрировать класс вручную.
Ответ написан
Комментировать
@kuza2000
Можно создавать свои классы на лету, используя type. Для этого ее нужно вызвать с тремя параметрами, вместо одного:
new_class = type('Model1', (), {})
Теперь в new_class лежит именно класс с именем Model1. После этого создаете объекты класса Model1:
a_model1 = new_class()
Я не знаю, как вы используете эти классы, но посмотрите 2-й и 3-й параметр type. Там можно указать родительский класс и инициализировать сразу свойства класса.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы