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
相关产品推荐
相关产品推荐

