将多def函数封装进Python class后出现函数未定义及调用异常问题排查
问题分析与解决方案
问题原因
- 类方法调用错误:类中的实例方法必须以
self作为第一个参数,且调用类内其他方法时需要通过self.xxx()的形式,原代码直接调用函数名,导致解释器找不到对应函数,抛出未定义错误。 - 实例打印行为未定义:直接打印类实例时,Python默认输出对象的内存地址,因为没有重写
__str__或__repr__方法来定义自定义打印内容。 - 原代码遗留错误:
player2_bet方法里的pla == 1是拼写错误,应为pla1 == 1;另外Flop(deck)函数和deck变量未定义,会导致运行时错误。
解决方法
- 给类中所有实例方法添加
self作为第一个参数,调用类内方法时统一使用self.前缀。 - 重写
__str__方法,定义实例被打印时的输出内容(比如返回当前的对局结果)。 - 修复拼写错误,处理未定义的
Flop和deck(暂时不需要可先注释,后续补充实现)。 - 实例化类后,需要调用
start()方法启动交互逻辑,而非直接打印实例。
修正后的完整代码
class TwoPlayer: def __init__(self): self.winner = '' def start(self): pla2 = 0 pla1 = int(input("What is pla1's choice? 1 , 2 , 3 :")) if pla1 == 3: self.winner = 'winner 2' return self.winner elif pla1 == 2 or pla1 == 1: return self.player2_bet(pla1, pla2) def player2_bet(self, pla1, pla2): pla2 = int(input("What is pla2's choice? 1 , 2 , 3 :")) if pla2 == 3: self.winner = 'winner 1' return self.winner elif pla2 == 2: if pla1 == 2: return 'check' elif pla1 == 1: return self.calpage(pla1, pla2) elif pla2 == 1: return self.calpage(pla1, pla2) def calpage(self, pla1, pla2): if pla1 == pla2 == 2: # Flop和deck未定义,先注释,后续补充实现 # Flop(deck) return 'Flop to be implemented' else: return self.player1_bet(pla1, pla2) def player1_bet(self, pla1, pla2): pla1 = int(input("What is pla1's choice? 1 , 2 , 3 :")) if pla1 == 3: self.winner = 'winner 1' return self.winner elif pla1 == 2: if pla2 == 2: return 'check' elif pla2 == 1: return self.player2_bet(pla1, pla2) elif pla1 == 1: return self.player2_bet(pla1, pla2) def __str__(self): # 定义打印实例时的输出 return f"TwoPlayer game result: {self.winner if self.winner else 'Game not finished'}" # 使用示例 game = TwoPlayer() result = game.start() print(result) # 打印实例查看结果 print(game)
内容的提问来源于stack exchange,提问作者신동협
相关产品推荐
相关产品推荐

