我是Python的新手,我收到了这个错误,但我不确定原因:
NameError: name 'Node' is not defined
class Node:
# initialisation/constructor
def __init__(self):
self.parents = []
self.children = []
self.parentWeights = []
self.nodeWeight = 0.0
# add child to node
def addChild(self, child, weight):
self.children.append(child)
# add parent with weight to node
def addParent(self, parent, weight):
self.parents.append(parent)
self.parentWeights.append(weight)
if not self in parent.children:
parent.addChild(self, weight)
def calculateWeight(self):
weightSum = sum(self.parentWeights)*self.nodeWeight
self.nodeWeight = weightSum
# run main function if not a library
if __name__ == '__main__':
i1 = Node()
i2 = Node()
h1 = Node()
h2 = Node()
o1 = Node()
h1.addParent(i1, 1)
h1.addParent(i2, 1)
h2.addParent(i2, 1)
h2.addParent(i2, 1)
o1.addParent(h1, -1)
o1.addParent(h2, 1)
i1.nodeWeight = 3
i2.nodeWeight = 5
calculateWeight(h1)
calculateWeight(h2)
calculateWeight(o1)
答案 0 :(得分:2)
您在Node
的定义中致电Node
。你必须在外面做。修复代码末尾的缩进应该。
通过修复缩进,我的意思是:从if __name__ == "__main__":
到最后,取出所有内容,然后将其缩小为4个空格。
答案 1 :(得分:2)
你的缩进是错误的。您的if __name__ == '__main__'
部分是class Node
的定义的一部分。
应该看起来像:
class Node:
## blah blah blah
## see, class and if are on the same indentation now!
if __name__ == '__main__':
i1 = Node()
i2 = Node()
h1 = Node()
h2 = Node()
o1 = Node()
h1.addParent(i1, 1)
h1.addParent(i2, 1)
h2.addParent(i2, 1)
h2.addParent(i2, 1)
o1.addParent(h1, -1)
o1.addParent(h2, 1)
i1.nodeWeight = 3
i2.nodeWeight = 5
calculateWeight(h1)
calculateWeight(h2)
calculateWeight(o1)
答案 2 :(得分:0)
python使用缩进代码块
当你在类定义代码块中输入 name ==' main '时,它被视为类声明,并将被执行,例如:< / p>
$ cat /tmp/test_class_statement.py
class demo(object):
if __name__ == '__main__':
print 'test'
x = demo()
这里我定义了一个类,解释器将尝试获取类demo的定义,然后它找到一个实际上没有声明的声明,但它会执行它,因为python解释器动态执行解释字节流一条指令和下一条指令,所以目前,它不知道你要声明什么,然后你只是打印一个字符串,实际上欺骗了解释器,但它会执行它。
然后声明了一个真实的属性,它是'x',但是类demo还没有完成它的定义,这意味着python解释器无法查找名为'demo'的类的结果,所以你得到一个错误: NameError:名称'demo'未定义
这是执行的结果:
$ python /tmp/test_class_statement.py
test
Traceback (most recent call last):
File "/tmp/test_class_statement.py", line 1, in <module>
class demo(object):
File "/tmp/test_class_statement.py", line 4, in demo
x = demo()
NameError: name 'demo' is not defined
这是另一个,证明如果可以找到预期的类,它可以工作:
$ cat /tmp/test_class_statement.py
class demo(object):
if __name__ == '__main__':
x = 1
print demo().x
这是输出
$ python /tmp/test_class_statement.py
1
如果您从另一个模块导入test_class_statement,这意味着名称不是 main ,则没有为类demo定义x
所以,正如其他答案所说:你应该将if name ==' main '代码块作为最左边的对齐,因为这是我们常见的方式定义主条目
并且调用对象方法的方法是:h1.calculateWeight(),而不是calculateWeight(h1)。 h1是一个对象引用,它正是'self',如果你熟悉java,你可以将它视为java的术语'this',这是规则,我无法解释它太深
答案 3 :(得分:-1)
修复缩进。 Python是indent sensitive language
从main
正文中提出class
的定义。代码应如下所示:
class Node:
// definition body
if __name__ == '__main__':
// main body