为什么pygame中自定义Sprite类的属性无法在外部函数中访问?
问题根源
代码中直接通过类名opponent访问rect、lives等属性,这类带self前缀的属性是类的实例对象专属属性,仅在类实例化后生成,不属于类本身,因此无法直接通过类名访问。
修复方案
- 首先实例化
opponent类得到实例对象,建议在全局作用域完成实例化,同时推荐按Python命名规范将类名改为大驼峰Opponent,避免和实例变量混淆:
# 实例化对手对象 op1 = opponent()
- 修改
op1_health_bar函数,适配实例访问,优先选择传参的方式,扩展性更强,适合多对手场景:
def op1_health_bar(op_instance): # 传入对手实例对象访问属性 pygame.draw.rect(screen, (255, 0, 0), (op_instance.rect.x - 30, op_instance.rect.top - 50, op_instance.lives / op_instance.health_ratio, 25)) pygame.draw.rect(screen, (255, 255, 255), (op_instance.rect.x - 30, op_instance.rect.top - 50, op_instance.health_length, 25), 4) # 调用函数时传入已实例化的对手对象 op1_health_bar(op1)
如果项目中仅存在一个全局对手实例,也可以直接访问全局实例:
def op1_health_bar(): global op1 pygame.draw.rect(screen, (255, 0, 0), (op1.rect.x - 30, op1.rect.top - 50, op1.lives / op1.health_ratio, 25)) pygame.draw.rect(screen, (255, 255, 255), (op1.rect.x - 30, op1.rect.top - 50, op1.health_length, 25), 4)
内容的提问来源于stack exchange,提问作者ram kador
相关产品推荐
相关产品推荐

