Создание переменных или экземпляров класса в режиме реального времени в Python

Я хочу иметь возможность создавать имена переменных, фактически экземпляры класса. Использование будет похоже на следующее:

S1 = Ship(name,lat,lon,length,beam,time,classification)

S2 = Ship(name,lat,lon,length,beam,time,classification)

SN = Ship(name,lat,lon,length,beam,time,classification)

Я не знаю, сколько там будет кораблей, но их могут быть десятки тысяч, так что о составлении списка или словаря идентификаторов заранее не может быть и речи. У каждого корабля будет имя (например, SS Hornblower), положение (широта и долгота), длина, ширина, время и классификация (грузовой, пассажирский, буксир и т. д.). S — это идентификаторы или имена, которые код дает каждому кораблю при его обнаружении. Причина в том, чтобы иметь возможность позже (через несколько минут) вспомнить их данные для сравнения и других целей: S2.getLat(), S3.getLat()...

В настоящее время я делаю идентификатор, объединяя символ «S» с числом (1,2,3, ...) по мере поступления информации о каждом корабле, но «S1», «S2» ... являются строками, а не переменными, и я не знаю, как сделать переменную из строки. Весь процесс должен быть автоматизирован. Никто не может вводить идентификаторы кораблей для сравнения или расчетов, поскольку данные поступают очень быстро. Какие-либо предложения?


person PaulJ    schedule 19.08.2018    source источник
comment
Если список из 50 000 экземпляров Ship неприемлем (хотя я не могу представить, почему бы и нет, если только ваш компьютер все еще не использует КБ вместо ГБ…), 50 000 отдельных Ship переменных определенно не будет приемлемым.   -  person abarnert    schedule 19.08.2018
comment
На самом деле я бы не согласился с приведенными здесь дубликатами, если у вас есть 50000 экземпляров корабля, которые, как мне кажется, говорят мне, что вам нужно либо посмотреть на использование namedtuples или pandas dataframes ‹- я знаю, что есть пример для namedtuples, но не нашел цель дублирования, если кто-нибудь найдет   -  person LinkBerest    schedule 19.08.2018
comment
@JGreenwell Как вы думаете, почему вам нужно namedtuple или DataFrame здесь? 50000 это ничто для современного компьютера. Использование namedtuple сопряжено со множеством ограничений, которые здесь могут быть неуместны — Ship будет неизменяемым, его можно будет использовать (случайно) как кортеж или итерируемый объект и т. д. И результат все равно больше, чем класс __slots__ (или @dataclass /@attr.s). Не говоря уже о том, что это полностью ортогонально проблеме — вам все равно нужно объяснить, как создавать и получать доступ к этим 50000 объектам, независимо от того, являются ли они экземплярами namedtuple или обычного класса.   -  person abarnert    schedule 19.08.2018
comment
@JGreenwell А что касается DataFrames: тогда у вас вообще нет объектов Ship, у вас есть только строки в таблице. Иногда это то, что вы хотите, но когда это не так, переосмысление всего вашего кода и уменьшение его читабельности только для экономии 1 МБ памяти обычно не стоит того.   -  person abarnert    schedule 19.08.2018
comment
@abarnert больше не из-за использования памяти, потому что, когда сущности начинают становиться такими большими (с ожиданием роста), я обнаруживаю, что многим людям (студентам, тем, кого я обучаю и т. д.) трудно понять, как использовать эти сущности. Чаще ответ заключается в том, что мне нужно использовать класс, потому что мне нужно использовать ООП вместо выбора структуры данных (фрейм данных, таблица данных с БД или namedtuple), которая имеет наибольший смысл. В любом случае, мой комментарий был больше связан с тем, что я искал старый дубликат при использовании экземпляра namedtuple или класса со словарем. Если найду, добавлю как связанный и удалю свой старый комментарий.   -  person LinkBerest    schedule 19.08.2018
comment
@JGreenwell Я до сих пор не понимаю, почему вы думаете, что namedtuple чем-то поможет. У вас все еще есть 50000 экземпляров класса; единственное отличие состоит в том, что эти экземпляры также являются кортежами, хотите вы этого или нет, и что класс определяется по-другому. К какому из этих преимуществ вы стремитесь?   -  person abarnert    schedule 19.08.2018
comment
Если он устанавливает группу экземпляров класса S1, S2, Sn и не меняет атрибуты после этого, namedtuple избежит проблем с хеш-памятью при использовании словаря для хранения этих экземпляров и может быть легче понять из-за это. Я собирался спросить OP, а затем найти сообщение, которое я помню, в котором показано добавление __hash__ по сравнению с использованием namedtuple со словарем, но, возможно, я что-то забыл.   -  person LinkBerest    schedule 19.08.2018