Python NameError:名称未定义

Posted

技术标签:

【中文标题】Python NameError:名称未定义【英文标题】:Python NameError: name is not defined 【发布时间】:2013-01-26 01:53:56 【问题描述】:

我有一个 python 脚本,但收到以下错误:

Traceback (most recent call last):
  File "C:\Users\Tim\Desktop\pop-erp\test.py", line 1, in <module>  
  s = Something()
  NameError: name 'Something' is not defined

这是导致问题的代码:

s = Something()
s.out()

class Something:
    def out():
        print("it works")

这是在 Windows 7 x86-64 下使用 Python 3.3.0 运行的。

为什么找不到Something 类?

【问题讨论】:

解决这个问题的方法是在定义类和函数后调用它们。 Python 没有任何方法来转发声明类或方法,因此唯一的选择是将函数的调用放在程序的末尾而不是开头。另一种选择是将您的方法放在文件顶部的导入库中,这些库总是首先被调用。 【参考方案1】:

在使用之前定义类:

class Something:
    def out(self):
        print("it works")

s = Something()
s.out()

您需要将self 作为第一个参数传递给所有实例方法。

【讨论】:

太好了,谢谢!我本来打算包括 self,只是在我快速写下这个简短示例时忘记了。 好吧——不是所有方法。总是有@staticmethod@classmethod,只是为了让事情变得有趣:-P @mgilson 为了更有趣,self@classmethod一起工作,这只是用词不当(应该称为cls)。 @delnan -- 是的,这当然是正确的。也许我不应该在那里添加@classmethod——但我只是想暗示你可以改变第一个参数是什么(或者即使它完全被传递)。我意识到变量名称 self 并没有什么神奇之处(除了一个非常根深蒂固的约定,无论如何都不应该被违反)。 @mgilson 我不是说你错了。我不怀疑你知道这一切。这只是另一个有趣的事实:-)【参考方案2】:

请注意,有时您会希望在其自己的定义中使用类类型名称,例如在使用 Python Typing 模块时,例如

class Tree:
    def __init__(self, left: Tree, right: Tree):
        self.left = left
        self.right = right

这也会导致

NameError: name 'Tree' is not defined

这是因为此时尚未定义类。 解决方法是使用所谓的Forward Reference,即将类名包装在字符串中,即

class Tree:
    def __init__(self, left: 'Tree', right: 'Tree'):
        self.left = left
        self.right = right

【讨论】:

【参考方案3】:

您必须在创建类的实例之前定义类。将Something 的调用移动到脚本的末尾。

您可以尝试本末倒置,并在定义之前调用程序,但这将是一个丑陋的黑客,您必须按照此处定义的方式滚动:

Make function definition in a python file order independent

【讨论】:

以上是关于Python NameError:名称未定义的主要内容,如果未能解决你的问题,请参考以下文章

NameError:名称'python'未定义[关闭]

Python - NameError:名称 itemgetter 未定义

Python / Access NameError:名称''未定义

Python 3:NameError:未定义名称“sklearn”

NameError:未定义全局名称“PermissionError”(python 2.x)

Python NameError:名称未定义