如何从Python列表中创建一个类实例

3

我正在为学校项目制作一个程序,它是一个模拟联合国的程序。

countries = ['Australia', 'Brazil', 'Canada']

class delegate(object):
   def __init__(self, country):
     self.country = country

我有一个国家列表和一个名为delegate的类。每个delegate对象必须有一个国家。通常我会这样做:

mexico = delegate('Mexico')

这就是全部内容。但我希望能循环遍历国家列表并为每个国家创建类实例。我的意思是:

australia = delegate('Australia')
brazil = delegate('Brazil')
canada = delegate('Canada')

等等。 我该如何制作这个? 非常感谢!


我建议您重新评估您选择的答案是否真正帮助了您。或者至少解释一下为什么那个答案可以帮助您实现您所寻求的目标?目前,这个答案恰好符合您的需求。 - idjaw
@idjaw 你好,我是Python(也是编程)的新手,我尝试了你指示的答案,但它显示出一个错误,而我选择的那个没有。我不知道为什么,但如果你能解释一下,我很乐意改变我的选择。实际上,我已经有了。 这是它显示的错误: delegates = {country: Delegate(country) for country in countries} ^ SyntaxError:无效语法 - Arturo.Mart
我只是复制粘贴了代码,没有收到语法错误。我建议你将代码复制并粘贴到一个新的Python文件中,不要添加其他内容,然后再试一次以确保。 - idjaw
我已经尝试过了。也许是版本的问题吗?我正在使用Python 2.6。 - Arturo.Mart
指定版本会帮助回答问题的人提供更适合您环境的答案。我目前在我的电脑上没有安装2.6版本,但这可能可以解释问题。 - idjaw
3个回答

11

从列表中创建具有名称的变量通常是个坏主意。也许你可以尝试

countries = ['Australia', 'Brazil', 'Canada']

class Delegate(object):    # according to PEP8, class names should be title-case
    def __init__(self, country):
        self.country = country

# create a dict
delegates = {country: Delegate(country) for country in countries}

编辑:根据@SethMMorton的说法,Python 2.6不支持字典推导式(即我上面使用的内容)。您可以使用以下方式获得相同的结果:

delegates = dict([(country, Delegate(country)) for country in countries])

3
注意:对于不需要显式继承自object的Python3代码,class Delegate:就足够了。 - idjaw
我不理解这个字典,当我将其写入程序时,它显示语法错误。 delegates = {country: Delegate(country) for country in countries} ^ SyntaxError:无效的语法 - Arturo.Mart
@Arturo.Mart 你用的是哪个 Python 版本?这在 Python 3.5.3 中对我来说完美地运行。 - Hugh Bothwell
1
@HughBothwell 他们正在使用Python 2.6(正如问题评论中所提到的)。对于该版本,没有dict推导式,因此您可能需要提到dict([(country, Delegate(country)) for country in countries])将适用于< Python 2.7。 - SethMMorton
@HughBothwell 我正在使用Python 2.6,如果有人能帮助我解决这个问题,我将非常感激。 - Arturo.Mart

1
[delegate(c) for c in countries]

-3

我相信你正在寻找所谓的匿名类。这意味着你正在创建一个没有分配给变量的类。例如:

country_delegates = []
for country in countries:
    country_delegates.append(delegate(country))

这将创建一个委托对象列表,每个国家对应一个委托对象。如果您想获取特定国家的委托对象,可以编写一个函数来搜索该列表并返回正确国家的委托对象。


1
你在这里并没有创建一个匿名类。你根本没有创建任何类。我想你可以折磨 type 构造函数来创建一个“匿名类”,但即使这样,也不是真正的匿名类... - juanpa.arrivillaga
非常不幸的是,这个被接受了,结果给未来的读者提供了非常误导性的指导。 - idjaw
你能详细说明一下吗?如果你有一个名为delegate的类,这段代码就可以正常工作。我认为匿名类是指实例化而没有被分配给变量的类,这不对吗? - KAL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接