2017-08-03 49 views
-1

我正在创建一个具有3个输入属性的类的程序。该程序调用一个函数,创建许多这些对象,其输入是基于对此问题不重要的其他标准给出的。动态更新多输入功能的所有实例

当我进一步发展我的计划,我可能要越来越多的属性添加到类。这意味着我必须去查找我用来创建这些对象的函数的所有实例,并更改输入参数。

例如,我的程序可能有很多这样的:

create_character(blue, pizza, running) 

其中输入对应于人物最喜欢的颜色,食物和活动。稍后,我可能要添加第四个输入,例如最喜欢的电影,或者可能是第五或第六或第九十九个输入。

专业程序员是否对构建其代码有任何建议,以便他们不必通过并单独更改调用create_character函数的每一行,以便它现在具有新的正确数量的输入?

查找和替换似乎罚款,但是这使得错误可能的,也似乎有些单调乏味。我期望至少调用这个函数50次。

+0

韦尔普,找到所有+全部替换是一个开始... –

+0

我的问题字面上问是否有替代这个。 –

回答

2

我能想到的几个选项供你怎么可以设计自己的类,以便更容易以后再延续新的“最喜欢的”东西。

第一种方法是使大部分(或全部)参数可选。也就是说,你应该为每一个指定一个默认值(如果没有可以作为默认值应用的实际值,可能是None)。这样,当你添加一个额外的参数时,调用没有新参数的函数的现有位置仍然可以工作,它们只会得到默认值。

另一种选择是使用一个容器(如字典)保持值,而不是使用用于每一个单独的变量或参数。例如,在你的例子中,可以使用像favorites = {'color': blue, 'food': pizza, 'activity': running}这样的字典来表示字符的最爱(假设这些值是在某处定义的),然后你可以传递字典而不是单独的项目。如果您使用的字典get方法,你也可以让这种类型的设计使用了默认值(favorites.get('movie')将返回None,如果你还没有更新,创建字典添加'movie'键的代码还)。

+0

我喜欢这两种想法,并且最终可能会使用字典方法的一些变体。谢谢! –

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 """ 
+0

这看起来超级整洁!我很确定这正是我正在寻找的东西,但是我必须稍微处理一下。谢谢! –

0

我真的很喜欢这个列表或字典输入法,但它仍然是混乱和允许误差的可能性。我最终做的是这样的:

我改变了类对象没有输入。收藏夹首先被分配了随机,默认或未指定的选项。

类对象被创建后,然后我编辑的对象的属性,像这样:

self.favorite_movie = "unspecified" 
self.favorite_activity = "unspecified" 

new_character = (character()) 
new_character.favorite_movie = "Dr. Strangelove" 

我认为,这样做的缺点方法是,它应该比直接输入变量慢。好处是这在未来很容易改变。也许当程序完成后,再转换到@Blckknight的方法并将输入作为列表或字典输入会更有意义。