You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 09:54:03