Переключать регистр как отображение словаря (значения = методы) - PullRequest
0 голосов
/ 24 марта 2020

Поскольку я довольно новичок python, я не могу решить, какое из следующих двух решений имеет больше смысла, или, возможно, вообще не имеет смысла.

Скажем, мой класс абстрагированных объектов выглядит следующим образом:

class SimpleData(object):

    def __init__(self, data):
        self.__data = data

    def __getData(self):
        return self.__data

    def __setData(self, data):
        self.__data = data

    data = property(__getData, __setData)

    @classmethod
    def create_new(cls, data):
        return cls(data)

Объекты этого класса, которые мне часто нужны (имеют «предопределенную полезную нагрузку объекта»), я хотел бы просто создать, «назначив» им preset_name. Используя preset_name, я могу создавать новые копии этих указанных c объектов, имеющих эту предопределенную полезную нагрузку, многократно.

Я мог бы использовать словарь:

class PresetDict(object):

    @classmethod
    def get_preset(cls, preset_name):
        return {
            'preset_111': SimpleData.create_new('111'),
            'preset_222': SimpleData.create_new('222'),
            'preset_333': SimpleData.create_new('333')
        }.get(preset_name, None)

или методы сопоставления, используя getattr:

class PresetMethod(object):

   @classmethod
   def get_preset(cls, preset_name):
       return getattr(cls, preset_name, lambda: None)()

   @classmethod
   def preset_111(cls):
       return SimpleData.create_new('111')

   @classmethod
   def preset_222(cls):
       return SimpleData.create_new('222')

   @classmethod
   def preset_333(cls):
       return SimpleData.create_new('333')

Оба решения в основном одинаковы:

print(PresetDict.get_preset("preset_111").data)
print(PresetDict.get_preset("preset_333").data)
print(PresetDict.get_preset("not present"))

print(PresetMethod.get_preset("preset_111").data)
print(PresetMethod.get_preset("preset_333").data)
print(PresetMethod.get_preset("not present"))

Я настоятельно предпочитаю словарное решение, так как его легче «читать», расширять и легче сохранить в будущем, особенно с большим списком пресетов.

Вот НО: Performancemace имеет важное значение. Здесь я абсолютно не понимаю, какое из этих двух решений будет работать лучше, особенно если список пресетов будет расти. Особенно словарь в PresetDict.get_preset выглядит для меня «хитроумно». Будет ли он создавать только экземпляр SimpleData, указанный с помощью «preset_name» при вызове, или он создаст все возможные экземпляры, указанные в словаре при вызове PresetDict.get_preset, затем вернет экземпляр, указанный с помощью «preset_name», а затем отбросит все другие экземпляры.

Надеюсь, вы сможете просветить меня по этому вопросу. Может быть, вы знаете о возможных улучшениях или даже о лучшем решении того, чего я хотел бы достичь?

Спасибо заранее!

1 Ответ

0 голосов
/ 24 марта 2020

вы правы, PresetDict.get_preset создаст все три объекта и вернет один. Вы можете просто добавить переменную класса в SimpleData, которая содержит словарь, так что он создается только один раз, и get_preset может возвращать экземпляры из этого

class SimpleData(object):

    _presets = {
        'preset_111': SimpleData('111'),
        'preset_222': SimpleData('222'),
        'preset_333': SimpleData('333')
    }

    @classmethod
    def get_preset(cls, preset_name):
        return cls._presets.get(preset_name, None)

Обратите внимание, что на самом деле это не более эффективно, это просто упростит создание часто используемых классов.

Также см. functools.lru_cache

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...