在Python中,从同一个类创建多个对象的最佳实践是什么?例如:
(doc, grumpy, happy, sleepy, bashful, sneezy, dopey) = Dwarf(), Dwarf(), Dwarf(), Dwarf(), Dwarf(), Dwarf(), Dwarf()
这非常笨拙。生成器表达式可以缩短它:
(doc, grumpy, happy, sleepy, bashful, sneezy, dopey) = (Dwarf() for i in range(7))
for i in range(7)
位似乎应该是不必要的。我见过使用... = (object,)*7
的{{3}},但这只适用于不可变的基本类型(数字,字符串,元组等)。如果用于用户类,它将为同一对象分配所有名称。
我主要是出于好奇,但我确实有时需要这个用于测试代码。我进行了相当广泛的搜索,但没有找到明确的答案。
答案 0 :(得分:2)
如果您需要许多类似的变量,您可以使用dict
而不是使用新变量发送垃圾邮件全局命名空间。试试这个:
dwarf_names = "doc grumpy happy sleepy ...".split():
dwarfs = {name: Dwarf() for name in dwarf_names}
并使用dwarfs["grumpy"].call_the_prince()
代替grumpy.call_the_prince()
。
如果必须创建新变量(我不认为他们应该这样做):
locals().update(dwarfs)
shold做的伎俩,但这个简单的问题很难看。
注意:在较旧的Python版本中,dict理解不存在:
dwarfs = dict((name, Dwarf()) for name in dwarf_names)
答案 1 :(得分:2)
矮人们不知道自己的名字似乎有点奇怪,但是:
make_dwarf = lambda *x: Dwarf()
doc, grumpy, happy, sleepy, bashful, sneezy, dopey = map(make_dwarf, xrange(7))
您也可以使用以下方法之一:
def multiple(callable, count):
return (callable() for _ in xrange(count))
doc, grumpy, happy, sleepy, bashful, sneezy, dopey = multiple(Dwarf, 7)
或
def multiple(Type):
return type('Muliplier', (object,),
{'__mul__': lambda self, count: (Type() for _ in xrange(count))})()
doc, grumpy, happy, sleepy, bashful, sneezy, dopey = multiple(Dwarf) * 7
后两者可能看起来像很多类型,但它们是通用的,因为它们可以使用任何可以不带参数调用的类型 - 并且可以修改以处理那些也可以。 / p>