在__init__方法中获取用户输入时实例变量为何未定义?
问题解决与代码修正
核心错误原因
- 创建
Player实例时传入的name、money等变量从未定义,且你的设计是在__init__里获取用户输入,完全不需要传这些参数,属于逻辑冗余导致的错误。 - 直接调用
__init__()报错是因为它是类的实例方法,必须通过类实例或类内部调用,全局环境中不存在这个方法。
代码中的其他问题
- 错误使用
cls:cls是类方法的参数,实例方法里要访问实例属性应该用self,比如cls.name要改成self.name。 - 变量赋值混乱:多次覆盖同一属性(比如先
self.name=name再立刻赋值为input),还有未定义的变量(比如self.busted=busted里的busted)。 - 卡片抽取错误:
random.sample(cards,1)返回的是列表,如果你要单个卡片元素,应该用random.choice(cards)。
修正后的完整代码
import random players = [] player_names = [] cards = [2, 3, 4, 5, 6, 7, 8, 9, 'kings', 'queens', 'aces'] class Player: def __init__(self): # 获取唯一用户名 while True: self.name = input('请输入你的名字: ') if self.name not in player_names: player_names.append(self.name) break print('用户名已被占用,请重新输入') # 初始化资金,支持用户输入或默认值 self.money = float(input('请输入初始资金: ') or 1000) # 获取合法的下注金额 while True: try: self.bet = float(input('请输入下注金额: ')) if 0 < self.bet <= self.money: break print(f'下注金额不能超过你的资金({self.money})或小于等于0,请重新输入') except ValueError: print('请输入有效的数字') # 初始化手牌和爆牌状态 self.cardl = [random.choice(cards), random.choice(cards)] self.busted = False # 创建玩家实例,无需传参,输入逻辑已在__init__内部实现 player = Player() players.append(player) print(f'欢迎你,{player.name}') # Dealer类单独定义,与Player角色逻辑分离 class Dealer: def __init__(self): self.cardl = [random.choice(cards), random.choice(cards)] self.busted = False
关键修正点说明
- 移除
__init__中冗余参数,实例化时直接调用Player()即可,输入逻辑完全内聚在方法内部。 - 完善用户名唯一性校验,确保不会重复。
- 增加下注金额合法性校验,拦截无效输入和超额下注。
- 修正卡片抽取方式,用
random.choice获取单个卡片元素,避免嵌套列表问题。 - 分离Dealer类,因为Dealer与Player的角色逻辑不同,无需继承。
内容的提问来源于stack exchange,提问作者somehelplease
相关产品推荐
相关产品推荐

