我正在创建一个具有3个输入属性的类的程序。程序调用一个函数来创建许多这些对象,并根据对此问题不重要的其他一些标准给出输入。
当我进一步开发我的程序时,我可能想要为该类添加越来越多的属性。这意味着我必须找到我用来创建这些对象的函数的所有实例,并更改输入参数。
例如,我的程序可能包含以下许多内容:
create_character(blue, pizza, running)
其中输入对应于角色最喜欢的颜色,食物和活动。稍后,我可能想要添加第四个输入,例如喜欢的电影,或者可能是第五个,第六个或第九十九个输入。
专业程序员是否有任何关于构造代码的建议,以便他们不必经历并单独更改create_character函数被调用的每一行,以便它现在具有新的,正确数量的输入? / p>
查找和替换似乎很好,但这使得错误成为可能,而且看起来也很单调乏味。我期待这个功能至少召唤50次。
答案 0 :(得分:2)
我可以考虑一些选项,让你可以设计你的课程,以便以后更容易扩展新的"最喜欢的"的东西。
第一种方法是使大多数(或所有)参数可选。也就是说,您应该为每个值指定默认值(如果不是可以作为默认值应用的实际值,则可能为None
)。这样,当你添加一个额外的参数时,调用没有new参数的函数的现有位置仍然有效,它们只会得到默认值。
另一种选择是使用容器(如字典)来保存值,而不是为每个容器使用单独的变量或参数。例如,在您的示例中,可以使用类似favorites = {'color': blue, 'food': pizza, 'activity': running}
的字典表示字符的收藏夹(假设这些值在某处定义),然后您可以传递字典而不是单独的项目。如果您使用字典的get
方法,也可以使此类设计使用默认值(favorites.get('movie')
如果您还没有更新创建的代码,则会返回None
要添加'movie'
密钥的字典。)
答案 1 :(得分:1)
您可以利用argument/keyword argument unpacking来支持动态更改的函数参数。还有生成所需功能的工厂函数/类:
def create_character(required1, required2, *opt_args, **kwargs):
""" create_character must always be called with required1 and required2
but can receive *opt_args sequence that stores arbitrary number of
positional args. kwargs hold a dict of optional keyword args """
for i, pos_arg in enumerate(opt_args):
# pos_arg walks opt_args sequence
print "position: {}, value: {}".format(i+3, pos_arg)
for keyword, value in kwargs:
print "Keyword was: {}, Value was: {}".format(keyword, value)
pos_args = (1,2,3)
create_character('this is required','this is also required', *pos_args)
""" position: 3, value: 1
position: 4, value: 2
position: 5, value: 3 """
a_dict = {
'custom_arg1': 'custom_value1',
'custom_arg2': 'custom_value2',
'custom_arg3': 'custom_value3'
}
create_character('this is required','this is also required', **a_dict)
""" Keyword was: custom_arg2, value: custom_value2
Keyword was: custom_arg3, value: custom_value3
Keyword was: custom_arg1, value: custom_value1 """
答案 2 :(得分:0)
我非常喜欢列表或字典输入法,但它仍然很混乱并且允许出错的可能性。我最终做的是:
我将类对象更改为没有输入。首先为收藏夹分配随机,默认或未指定的选项。
创建类对象后,我编辑了对象的属性,如下所示:
{
"_id" : ObjectId("59b035a9f5ec1e38a0e668be"),
"zipcode" : "10001",
"city" : "New York",
"state_full" : "New York",
"state" : "NY",
"county" : "New York",
"loc" : {
"type" : "Point",
"coordinates" : [
-73.9967,
40.7484
]
}
}
我认为这种方法的缺点是它应该比直接输入变量慢。好处是,未来很容易改变。也许当程序完成后,将更有意义的是转换为@Blckknight的方法,并将输入作为列表或字典。