为什么名称节点未定义?

时间:2014-03-25 06:56:45

标签: python

我是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)

4 个答案:

答案 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