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:名称未定义的主要内容,如果未能解决你的问题,请参考以下文章
Python - NameError:名称 itemgetter 未定义
Python / Access NameError:名称''未定义
Python 3:NameError:未定义名称“sklearn”