---------------------------------------------------------------------------
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)
没有错误,输出正如预期的那样。
答案 0 :(得分:0)
名称&#39;比例&#39;但是,解释者的定义永远不会错误
虽然定义了吗?您在自己的定义中使用Scale
。在解释器访问第60行时,它还没有定义Scale
。更不用说它的属性zv
和newton
了。相反,您可以在定义zv
之前尝试定义newton
和scales
。
class Scale:
screening = False
newtoncount = 0
zv = 'zv'
newton = 'newton'
scales = [zv, newton]
scale = Scale()
print scale.scales
编辑:
我很高兴你有一些工作(从你上次的编辑判断)。在您的工作示例中没有错误,因为things
在holder
的定义中使用之前已完全定义。
您可以通过在类定义中使用__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