定义名称时的NameError

时间:2017-03-06 03:14:03

标签: python ipython-notebook jupyter nameerror

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-1-902791409a52> in <module>()
     57         ObjectLists.sounds[5].play_sound()
     58 
---> 59 class Scale:
     60     scales = [Scale.zv, Scale.newton]
     61     screening = False

<ipython-input-1-902791409a52> in Scale()
     58 
     59 class Scale:
---> 60     scales = [Scale.zv, Scale.newton]
     61     screening = False
     62     newtoncount = 0

NameError: name 'Scale' is not defined

不能为我的生活弄清楚这是什么。定义了“Scale”这个名称,然而,解释器从来没有错。我错过了什么?

编辑:当我跑步时:

class things:
    poo = [things.roughage(), things.towels()]
    @staticmethod
    def roughage():
        return('health')

    @staticmethod
    def towels():
        return('dryness')

print(things.poo)

它引发了一个NameError;事情没有定义。

但是当我跑步时:

class things:
    @staticmethod
    def roughage():
        return('health')

    @staticmethod
    def towels():
        return('dryness')

class holder:
    poo = [things.roughage(), things.towels()]

print(holder.poo)

没有错误,输出正如预期的那样。

2 个答案:

答案 0 :(得分:0)

  

名称&#39;比例&#39;但是,解释者的定义永远不会错误

虽然定义了吗?您在自己的定义中使用Scale。在解释器访问第60行时,它还没有定义Scale。更不用说它的属性zvnewton了。相反,您可以在定义zv之前尝试定义newtonscales

class Scale:
    screening = False
    newtoncount = 0
    zv = 'zv'
    newton = 'newton'
    scales = [zv, newton]

scale = Scale()
print scale.scales

编辑: 我很高兴你有一些工作(从你上次的编辑判断)。在您的工作示例中没有错误,因为thingsholder的定义中使用之前已完全定义。

您可以通过在类定义中使用__init__函数并在{{>> 上访问poo来实现您正在寻找的内容的另一种方式。 1}}而不是类本身。

things

这样您就不需要将定义分为两类。

我对这些类的完整实现一无所知,但我想指出这两个实现中的两个主要区别。

class things(): def __init__(self): self.poo = [self.roughage(), self.towels()] @staticmethod def roughage(): return('health') @staticmethod def towels(): return('dryness') holder = things() # create an instance of things print(holder.poo) 的示例和Scales的第一个实现声明了类级属性,而我的实现将things声明为实例级属性。

快速搜索发现以下关于该主题的链接:

答案 1 :(得分:0)

在Python中,在创建之前不能使用某些东西。解释器以一种相当线性的自上而下的方式工作,所以即使像

那样简单
foo()
def foo():
    print('hi')

会引发NameError

要创建类,解释器将执行类定义,然后将生成的类对象绑定到提供的名称。您的第一个things示例尝试在绑定到对象之前和对象本身存在之前使用名称things。它还试图在这些静态方法存在之前调用它们。

我意识到你的代码只是一个玩具示例,但它不是一个非常典型的Python类:它没有实例属性,也没有普通方法,只有静态方法。当然,这种语言允许你这样做,但是制作用于创建实例的类更为常见。

FWIW,可以在__init__方法中初始化一个类属性。当然,如果您无意创建实例,那就没用了,但无论如何我都会展示一个简短的例子。

class Things():
    poo = None

    def __init__(self):
        if Things.poo is None:
            print('Initialising poo...')
            Things.poo = [self.roughage(), self.towels()]

    @staticmethod
    def roughage():
        return('health')
    @staticmethod
    def towels():
        return('dryness')

print(Things.poo)

h1 = Things()
p = h1.poo
print(p, id(p))

p = Things.poo
print(p, id(p))

h2 = Things()  
p = h2.poo
print(p, id(p))

<强>输出

None
Initialising poo...
['health', 'dryness'] 3072932652
['health', 'dryness'] 3072932652
['health', 'dryness'] 3072932652

初始化也可以用

完成
Things.poo = [Things.roughage(), Things.towels()]
['health', 'dryness'] 3072924460