Поскольку я довольно новичок 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», а затем отбросит все другие экземпляры.
Надеюсь, вы сможете просветить меня по этому вопросу. Может быть, вы знаете о возможных улучшениях или даже о лучшем решении того, чего я хотел бы достичь?
Спасибо заранее!