Как в Python присвоить объекту класс, если имена классов хранятся в списке?
У меня есть список, в котором хранится пары "SNMP SysObjectID" - "Model". Это у меня для внутренних скриптовых нужд:)
Чтобы не плодить всяких разных дублирующих списков - я решил значение, хранящееся в "Model" использовать как имя класса (с большой буквы, без спецсимволов, всё как надо).
Но вот в цикле я никак не могу объекту (в моем случае это ip адрес) присвоить класс. Нет такого метода.
Тоесть, я получаю SysObjectID по SNMP, проверяю в списке по этому SysObjectID значение Model.
И вот объекту как этот результат (значение Model) присвоить в качестве класса?...
Если делать цикл с проверкой что if "Model" == 'Des320026a1' then ip = Des320026a1(), то когда на сети появится новый вендор - надо будет дописывать строки, относящиеся к этому вендору, в двух, а то и трёх местах.
Хотелось бы этого избежать. Потому и имена классов я называл в соответствии со значением "Model".
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)
class KnownClasses:
# используем статическое поле класса,
# так как к нему проще получить доступ из разных модулей
collection: typing.Dict[str, typing.Type] = {}
class SomeKnownClass:
... # тут тело класса
# регистрируем класс
KnownClasses.collection[SomeKnownClass.__name__] = SomeKnownClass
При желании можно заморочиться дальше, используя метаклассы, и избавиться от необходимости регистрировать класс вручную.
Можно создавать свои классы на лету, используя type. Для этого ее нужно вызвать с тремя параметрами, вместо одного: new_class = type('Model1', (), {})
Теперь в new_class лежит именно класс с именем Model1. После этого создаете объекты класса Model1: a_model1 = new_class()
Я не знаю, как вы используете эти классы, но посмотрите 2-й и 3-й параметр type. Там можно указать родительский класс и инициализировать сразу свойства класса.