2014-03-25 89 views
0

我是新来的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) 

回答

2

您的Node定义中调用Node。你必须在外面去做。在代码的末尾修复缩进应该这样做。

通过修复缩进我的意思是:从if __name__ == "__main__":一直到最后,并将其缩减4个空格。

+0

你可以在其自己的类定义中调用'Node'。唯一的问题是缩进。 – Ivo

+0

试试这个:'class C:C()'(在':'后面加一个换行符)。你会得到'NameError:name'C'没有被定义'。 – Bach

-1

修复您的缩进。 Python是indent sensitive language

class身体带出main的定义。代码应如下所示:

class Node: 
    // definition body 

if __name__ == '__main__': 
    // main body 
+0

这不提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 – RedBaron

+0

增加了一个问题的答案。谢谢 :) –

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) 
0

Python中使用缩进代码块

如你所说的,如果 ==“主要”廉政类定义代码块,它被视为作为类声明,并将执行,例如:

$ cat /tmp/test_class_statement.py 
class demo(object): 
    if __name__ == '__main__': 
     print 'test' 
     x = demo() 

这里我定义了一个类解释器会尝试获取类演示的定义,然后找到一个实际上什么都不声明的声明,但是它会执行它,因为python解释器是动态执行解释的字节流的一条指令和下一条指令,所以目前它不会知道你想要声明什么,然后你只是打印一个字符串,实际上欺骗了解释器,但它会执行它。

然后声明一个真实的属性,它是'x',但类演示还没有完成它的定义,这意味着python解释器无法查找名为'demo'的类的结果,所以你得到一个错误:NameError:名称“示范”没有定义

这里是执行结果:

$ 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不主要,那么x不上课演示定义

所以,其他回答说:你应该打算将名称 ==''主要'代码块作为最左对齐,因为是我们定义主条目的常用方式

以及调用对象方法的方法是:h1.calculateWeight(),不计算权重(h1)。 h1是一个对象引用,它就是'自我',如果你熟悉java,那么你可以把它当作java的术语'this',这是规则,我不能解释它太深