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

2024-06-01 22:58:47 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我问这个问题主要是出于好奇,尽管有时我确实需要这个来测试代码。我搜索了相当广泛,还没有找到确切的答案。你知道吗


Tags: 对象infordocobject表达式rangehappy
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)

我应该这么做,但这个简单的问题很难看。你知道吗

注意:在不存在dict理解的旧Python版本上:

dwarfs = dict((name, Dwarf()) for name in dwarf_names)

看起来有点奇怪,矮人不知道自己的名字,但是:

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

后两种类型可能看起来像是大量的类型,但它们是通用的,因为它们可以处理任何可以不带参数调用的类型,并且可以修改以处理那些不带参数的类型。你知道吗

相关问题 更多 >