如何为自动创建的Python类对象命名
假设我有一个叫“Map”的类,这个类在创建时需要一个参数“country”。当我实例化Map的时候,它应该根据这个国家的城市名称列表来创建一些“City”类的对象。但是,我该怎么给这些“city”对象命名呢?
伪代码:
class Map(object):
def __init__(self, country):
for i in range(len(citynames)):
cityname_i = City(i)
用简单的话说,假设我有一个城市名称的列表:["Boston", "Chicago", "Denver"]。当我做类似这样的操作时:
us_map = Map(america)
我希望Map能够创建三个City类的实例(这个类在别的地方定义),它们的名字分别是“Boston”、“Chicago”和“Denver”。
我对这些还不太熟悉,所以可能把面向对象编程的术语搞混了。如果是这样,请纠正我。
编辑
看来我的例子让人有些困惑。我的意思是,我的问题并不是关于字典的。我只是用它作为一个例子。
我正在制作一个游戏,玩家可以上传任意数量的场景。我不知道他们会上传多少个场景。但所有的场景基本上都是以相同的方式工作,包含一些方法。所以当我创建´game = Game(folder)´时,我的类应该为每个上传的场景文件创建一个Scenario类的实例。然后,第三个类“Engine”会依次执行所有的场景……
但是,我该如何自动给“Scenario”的实例命名呢?
目前我使用´glob´来查找相关文件夹中的场景文件。所以我把这些文件放在一个列表中,放在类外面。
更新:
看来我没有把问题说清楚(我能否动态地自动创建实例),或者大家更愿意给我指个方向,而不是直接回答我的问题。无论如何,我觉得字典是个不错的选择。所以现在我就先关闭这个问题(rplnt是第一个回答的人),并把正确的答案给第一个发帖的人。
3 个回答
我会这样做:
class Map(object):
CITIES = { "america": ["Boston", "Chicago", "Denver"], "germany": ["Munich" , ...], ...}
def __init__(self, country):
self.cities = []
for city_name in Map.CITIES[country].values():
self.cities.append(City(city_name))
基本上,你需要创建一个容器类的实例,并把它存储在你的 Map
类实例的一个属性里(也就是 self.cities
)。
理想情况下,这个容器的类型应该适合你在 Map
中如何使用和处理城市的集合。比如说,城市的成员会经常被添加、删除或者修改吗?你会经常遍历这些城市吗?它们需要保持某种顺序,还是可以随时重新排序?
根据你对这些问题的回答,Python 提供了很多内置的高性能数据类型,比如列表、字典和集合,这些都可能适合你的需求。如果有必要,你也可以创建自己的容器类。
再说一次,就像我之前的回答一样,我建议把这些对象放在一个字典里。这样做的好处是比在命名空间中创建它们更容易管理。也就是说,如果你像你说的那样创建它们,你仍然需要知道这些对象的存在,可能需要记住它们在列表(或者字典?)中的引用。如果你想依赖于这些名字的列表,那么你的代码就会充满try
语句。