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

Python使用OOP编写类时代码报NameError的原因是什么?

NameError原因分析
  • 作用域问题:你将Man、Woman、Human三个类都定义在了God函数内部,Python中函数内部定义的类属于函数局部作用域,仅能在函数内部被访问,函数外部的全局作用域不存在这三个类的名称引用,因此测试代码中直接使用Man做类型判断时会触发名称未定义的NameError。
  • 额外逻辑问题:你当前的返回值为[a.__class__,b.__class__],返回的是类对象本身,而非你预期的类实例,即使解决了名称错误,isinstance判断也会返回不符合预期的结果。
解决方案

方案1:将类定义移至全局作用域(最常用,适合需要外部复用类的场景)

直接把三个类的定义挪到God函数外,同时修改返回值为实例本身即可:

class Human:
    def __init__(self):
        pass
class Man(Human):
    def __init__(self):
        pass       
class Woman(Human):
    def __init__(self):
        pass  

def God():
    a = Man()
    b = Woman()
    # 返回实例而非类对象
    return [a, b]

# 测试代码可正常运行
paradise = God()
test.assert_equals(isinstance(paradise[0], Man) , True, "First object are a man")

方案2:保留类的内部定义,修改测试逻辑

如果业务要求三个类必须封装在God函数内部、不允许污染全局作用域,可以调整测试逻辑,不依赖全局的Man名称做判断:

def God():
    class Human:
        def __init__(self):
            pass
    class Man(Human):
        def __init__(self):
            pass       
    class Woman(Human):
        def __init__(self):
            pass   
    a=Man()
    b=Woman()
    return [a, b]

# 调整后的测试逻辑
paradise = God()
test.assert_equals(paradise[0].__class__.__name__ == 'Man' , True, "First object are a man")

内容的提问来源于stack exchange,提问作者Round Robin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:27:04