Python 报错:NameError:name is not defined

72
我有一个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 类?


6
解决这个问题的方法是在定义类和函数后再调用它们。Python 没有任何方式来预先声明类或方法,所以唯一的选择是将函数的调用放在程序的末尾而不是开头。另一个选项是将你的方法放在导入的库中,放在文件顶部,这样它们总是最先被调用。 - Eric Leschinski
4个回答

111

在使用之前定义类:

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

s = Something()
s.out()

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


еҘҪеҗ§пјҢдёҚжҳҜжүҖжңүж–№жі•гҖӮжҖ»жңү@staticmethodе’Ң@classmethodпјҢиҝҷж ·жүҚжңүи¶Ј :-P - mgilson
@mgilson 如果想增加乐趣,self将会在@classmethod中起作用,但是这个名字并不准确(应该称为 cls)。 - user395760
@delnan -- 是的,当然是正确的。也许我不应该在那里添加 @classmethod -- 但我只是想暗示您可以更改第一个参数是什么(甚至是否传递它)。我意识到变量名 self 没有什么神奇之处(除了非常根深蒂固的约定,无论如何都不应该违反)。 - mgilson
@mgilson 我并不是在说你错了。我也不怀疑你知道这些。这只是另一个有趣的事实 :-) - user395760
这是Python的一般原则之一:“Python从上到下运行,具有命名空间。” 它从顶部开始,在主命名空间中查看class Something:行,并解析类将Something放入命名空间中。 - Charles Merriam

23

需要注意的是,有时您会想在其自身定义中使用类类型名称,例如在使用 Python 的 Typing 模块时。

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

这也会导致

NameError: name 'Tree' is not defined

这是因为在此时尚未定义该类。 解决方法是使用所谓的前向引用,即将类名包装在字符串中,例如:

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

1
现在您可以使用 from __future__ import annotations 代替将名称包装在字符串中。 - interoception

5

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

你可以试图在定义过程之前调用它们,但这将是一个丑陋的黑客,你必须按照这里定义的方式自己解决:

使Python文件中的函数定义无序


-1
我遇到了与下面相同的错误:

NameError: name 'name' is not defined

当我没有使用@property定义getter方法,而setter和deleter方法如下所示:
class Person:
    def __init__(self, name):
        self._name = name

    # @property
    # def name(self):
    #     return self._name

    @name.setter
    def name(self, name):
        self._name = name

    @name.deleter # Here
    def name(self):
        del self._name

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接