关于oop:Python:通过变量名称引用对象属性?

Python: Reference an object attribute by variable name?

本问题已经有最佳答案,请猛点这里访问。

我正在用python编程棋盘游戏的垄断。垄断有三种类型的土地,玩家可以购买:财产(如木板路),铁路和公用事业。房产的购买价格和租金有6个条件(0-4套房子或一家酒店)。铁路和公用事业有固定的价格和租金的基础上有多少其他铁路或公用事业你拥有。

我有一个包含三个字典属性的game()类,所有这些属性的键都是从0到39的地块在板上的位置:

  • .properties,其值是包含空间名称、购买价格、颜色组和租金(tuple)的列表;
  • .铁路,仅由空间名称组成;
  • .utilities,也只包含空间名称。

我之所以这样做,是因为在某些时刻,我想迭代相应的字典,以查看玩家是否拥有该字典中的其他土地块;还因为值的数量不同。

game()还具有一个名为space_types的元组,其中每个值都是表示空间类型(财产、铁路、公用事业、奢侈税、go等)的数字。要了解我的玩家所坐的空间类型,请执行以下操作:

space_type = space_types[boardposition]

我还有一个带有方法buy_property()的player()类,其中包含一个print语句,它应该说:

江户十一〔一〕号

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

1
2
3
4
5
6
7
8
9
    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

我想做的是这样的事情:

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

在python中,是否可以将变量的值作为要引用的属性的名称传递?我也会感激有人告诉我,我正在接近这个根本错误的方向,并建议一个更好的方法来解决这个问题。


使用getattr内置:

1
PropertyName = getattr(Game, dictname)

http://docs.python.org/2/library/functions.html_getattr


字典怎么样?

1
2
3
D= {"property": Game.properties,"railroad": Game.railroads,"utility": Game.utilities}
space_type = Game(space_types[board_position])
dictname = D[space_type]


您可以使用getattr功能:

1
property_name = getattr(Game, dictname)