2

我正在用 Python 编写棋盘游戏 Monopoly。Monopoly 拥有三种玩家可以购买的土地:房产(如木板路)、铁路和公用事业。物业有 6 种条件(0-4 栋房屋或酒店)的可变购买价格和租金。铁路和公用事业有固定的价格和租金,具体取决于您拥有多少其他铁路或公用事业。

我有一个包含三个字典属性的 Game() 类,所有属性的键都是地块在棋盘上从 0-39 的位置:

  • .properties,其值为包含空间名称、购买价格、颜色组和租金(元组)的列表;
  • .railroads,仅包含空间名称;
  • .utilities,也只包含空间名称。

我这样做是因为在某些时候我想遍历适当的字典以查看玩家是否拥有该字典中的其他土地;也因为值的数量不同。

Game() 还有一个名为 space_types 的元组,其中每个值都是一个数字,代表一种空间类型(财产、铁路、公用事业、奢侈税、GO 等)。要找出我的播放器坐在哪种 space_type 上:

space_type = space_types[boardposition]

我还有一个带有方法 buy_property() 的 Player() 类,它包含一个打印语句,应该说:

"You bought PropertyName for $400."

其中 PropertyName 是空间的名称。但是现在我必须像这样使用 if/elif/else 块,这看起来很难看:

    space_type = Game(space_types[board_position])
    if space_type is "property":
         # pull PropertyName from Game.properties
    elif space_type is "railroad":
         # pull PropertyName from Game.railroads
    elif space_type is "utility":
         # pull PropertyName from Game.utilities
    else:
         # error, something weird has happened

我想做的是这样的:

    dictname = "dictionary to pull from"  # based on space_type
    PropertyName = Game.dictname  # except .dictname would be "dictionary to pull from"

在 Python 中是否可以将变量的值作为要引用的属性的名称传递?我也很感激有人告诉我我正在接近这个根本错误并提出更好的解决方法。

4

3 回答 3

4

使用getattr内置:

PropertyName = getattr(Game, dictname)

http://docs.python.org/2/library/functions.html#getattr

于 2013-06-12T01:46:07.840 回答
2

您可以使用以下getattr功能:

property_name = getattr(Game, dictname)
于 2013-06-12T01:44:01.497 回答
2

字典词典怎么样?

D= {"property": Game.properties, "railroad": Game.railroads, "utility": Game.utilities}
space_type = Game(space_types[board_position])
dictname = D[space_type]
于 2013-06-12T01:44:44.790 回答