紧凑形式的重复类实例化和赋值

时间:2014-06-07 15:43:45

标签: python oop variable-assignment

在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}},但这只适用于不可变的基本类型(数字,字符串,元组等)。如果用于用户类,它将为同一对象分配所有名称。

我主要是出于好奇,但我确实有时需要这个用于测试代码。我进行了相当广泛的搜索,但没有找到明确的答案。

2 个答案:

答案 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>