切换情况,例如字典映射(值=方法)

问题描述 投票:0回答:1

由于我是相当新的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,我可以重复创建具有特定预定义负载的那些特定对象的新副本。

我可以使用字典:

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"))

[我非常喜欢字典解决方案,因为它更易于“阅读”,扩展和将来维护,尤其是带有大量预设时。

这里是但:表演很重要。在这里,我绝对没有洞察力,这两种解决方案中的哪一种将表现更好,尤其是当预设列表增加时。特别是PresetDict.get_preset中的词典对我来说看起来像是“狡猾”。当调用PresetDict.get_preset时,它将仅创建通过“ preset_name”指定的SimpleData实例,还是将创建在字典中指定的所有可能的实例,然后返回通过“ preset_name”指定的实例,然后丢弃所有其他实例。 >

希望您能启发我此事。也许您知道我想要实现的可能的改进甚至更好的解决方案?

提前感谢!

由于我是相当新的python,所以我无法确定以下两种解决方案中的哪一种更有意义,或者根本没有意义。假设我的抽象对象类如下:class SimpleData(object):...

python dictionary methods switch-statement mapping
1个回答
0
投票

您是对的,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)
© www.soinside.com 2019 - 2024. All rights reserved.