由于我是相当新的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):...
您是对的,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)