【问题标题】:TypeError: 'node' object is not callableTypeError:“节点”对象不可调用
【发布时间】:2015-12-29 01:53:50
【问题描述】:

当我尝试获取上一个节点时出现错误 (TypeError: 'node' object is not callable)。我做错了什么?

我的节点类:

class node(object):
    def __init__(self):
        self.node=[]
        self.info = None
        self.prev = None
        self.depth=-1
        self.step = []
    def prev(self):
        return self.prev
    def add(self):
        node1=node()
        self.node.append(node1)
        node1.prev=self
        return node1

我的代码访问prevlast_node 的深度值应该在 5 左右):

rev = last_node
dep = rev.depth
revPath = [None]*(dep*4)
for g in range(0,dep):
    revPath[dep - (g*4) - 1] = rev.step[3]
    revPath[dep - (g*4) - 2] = rev.step[2]
    revPath[dep - (g*4) - 3] = rev.step[1]
    revPath[dep - (g*4) - 4] = rev.step[0]
    rev = rev.prev()

附加信息:

我试图向后遍历树以查看所采用的路径。 step[] 值只是抓取几个整数。除了prev 之外,该代码也可以正常运行(即,如果我取出零件以查找所采用的路径,则没有问题)。

【问题讨论】:

    标签: python object tree typeerror callable


    【解决方案1】:

    您在类中定义了一个名为 prev 的方法,但在构造函数中将 None 分配给 self.prev,然后在 add 中再次使用 node 实例分配给它。

    因此,当您尝试调用 rev.prev() 时,该方法已被覆盖,而您实际上是在尝试调用 node 对象,因此出现错误。

    在 Python(参见 PEP-0008)中,通常使用下划线作为私有字段(客户端代码不应使用的字段)的前缀,如下所示:

    def __init__(self):
        self._node=[]
        self._prev = None
        # Etc.
    

    用小写命名你的类也是有风险的,因为任何名为node 的变量都会隐藏它并使其无法访问。 Python 中的约定是对类名使用 Pascal 大小写(以大写字母开头)(再次参见 PEP-0008)。

    【讨论】:

    • 感谢您的快速回复。我没有意识到将其设为私有可能会成就或破坏看起来应该如此简单的事情。我想我应该阅读更多关于类应该如何工作的内容。
    • @Upgrayded Python 没有明确的私有成员概念;使用前导下划线来表示“隐私”只是传统的做法。这样做的另一个好处是可以减少您在此处遇到的名称冲突。
    猜你喜欢
    • 2019-08-15
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 2021-04-15
    • 2011-10-01
    • 2020-11-10
    • 2017-09-09
    相关资源
    最近更新 更多