Python 如何根据类实例的属性值查找对应实例的指定属性?
按座位号查询玩家名的实现方法
你现在把玩家对象零散定义成p1、p2、dealer这类独立变量的写法,本身就不支持“不知道对应变量名、只凭座位号查玩家”的需求,可根据场景选以下两种实现:
方案1:兼容现有零散变量的临时写法
如果暂时不想重构已经写好的零散对象定义,可以遍历当前全局作用域的所有对象,筛选出匹配目标座位号的Player实例:
def get_player_name(target_seat): # 遍历全局作用域的所有变量 for _, obj in globals().items(): # 匹配Player类实例,且seat属性和目标座位一致 if isinstance(obj, Player) and getattr(obj, "seat", None) == target_seat: return obj.name # 没找到对应玩家返回None return None # 调用即可拿到座位3的玩家名 player_3_name = get_player_name(3)
注意:这个方案只适合临时调试用,长期用问题很多:需要遍历整个全局作用域效率低,还可能误匹配其他同类型的Player实例,结果完全没保障。千万别靠猜变量命名规则(比如默认座位3的对象叫p3)做查询,这本身就是非常脆弱的写法,命名一改代码立刻崩。
方案2:结构化存储的标准写法
这是实际开发里推荐的正规实现:初始化的时候就把所有玩家对象以座位号为键存入映射字典,后续查的时候直接按键取值,完全不需要知道每个玩家对应的独立变量名:
class Player: def __init__(self, name, seat, balance): self.name = name self.seat = seat self.balance = balance # 初始化时直接建座位号到玩家对象的映射 seat_to_player = { 7: Player("Dealer", 7, 1000), 1: Player("Player1", 1, 100), 2: Player("Player2", 2, 100), 3: Player("Player3", 3, 100), 4: Player("Player4", 4, 100), 5: Player("Player5", 5, 100), 6: Player("Player6", 6, 100), } # 直接按座位号拿玩家名,根本不用提前知道对应变量叫啥 player_3_name = seat_to_player[3].name
这个写法的好处:
- 查询效率是O(1),不用遍历全量对象
- 座位和玩家一一绑定,不会出现误匹配的问题
- 后续新增、移除玩家只需要改这个映射字典,不用零散调整各个独立变量的定义
内容的提问来源于stack exchange,提问作者75suited
相关产品推荐
相关产品推荐

