Python中随机生成怪物函数返回列表无法作为Mob类实例参数的问题
问题原因及解决方法
核心报错根因
你调用Mob构造函数时没有对CreateMob()返回的列表做解包操作:
CreateMob()返回的是一个包含7个元素的单列表对象,直接传入Mob(CreateMob())时,整个列表会被当做第一个位置参数传递给Mob.__init__的*args,此时args实际结构是[ [name, lvl, hp, strength, defense, agility, wpn] ],传给父类Base.__init__时就只有1个参数,自然会提示缺少剩下6个位置参数。- 正确写法是使用
*对列表做解包,将列表的每个元素依次作为独立的位置参数传入:Mob(*CreateMob())
其他需要修正的代码错误
你的代码还有一处拼写错误会导致后续运行报错:
在Base类的__init__方法中,seld.agility = agility存在笔误,应该改为self.agility = agility
修正后可运行的代码片段
import random as r import math # Define base character class and attributes class Base: def __init__(self, name, lvl, hp, strength, defense, agility, wpn): self.name = name self.lvl = lvl self.hp = hp self.strength = strength self.defense = defense self.agility = agility # 修正拼写错误 self.wpn = wpn # Set Mob class class Mob(Base): def __init__(self, *args): super().__init__(*args) #Mob Names m_names = ["Goblin", "Minotaur", "Imp", "Rat", "Chimera", "Bandit"] h_lvl = 1 def CreateMob(): stats ={} stats["name"] = r.choice(m_names) stats["lvl"] = r.randint(h_lvl, h_lvl+2) stats["hp"] = r.choice(r.sample(range(stats["lvl"]*8, stats["lvl"]*16), 4)) stats["strength"] = r.randint(math.ceil(stats["lvl"]/3), math.ceil(stats["lvl"]/2)) stats["defense"] = r.randint(math.ceil(stats["hp"]/25), math.ceil(stats["hp"]/20)) stats["agility"] = r.randint(math.ceil(stats["lvl"]/4), math.ceil(stats["lvl"]/2)) stats["wpn"] = round(r.uniform(1, ((stats["lvl"]*0.0625)+1 )), 2) return list(stats.values()) for i in range(1): print(Mob(*CreateMob())) # 增加*解包列表
内容的提问来源于stack exchange,提问作者Justice Brinston
相关产品推荐
相关产品推荐

