pydot实现不可扩展。打破继承

时间:2014-01-06 21:39:33

标签: python python-2.7

我遇到了python继承问题。

这个例子只概述了层次结构,因为我不能在这里发布更复杂的代码,所以请耐心等待我提供所需的所有细节。

我定义了两个类:

class A(pydot.Node):
    def __init__(self):        
        # do some init
        pydot.Node.__init__(self)

    def very_useful_method(self):
        return self._valuable_property

class B(A):
    def __init__(self):
        # do some initialization
        A.__init__(self)


if "__main__" == __name__
    # some code that uses add_node and get_nodes
    retrieved_b_instance.very_useful_method() #error, **Node** object has no attribute very_useful_method...

我非常确信我没有得到正确的继承过程,并且我对__init__调用做错了。

我正在使用python 2.7。

有什么建议吗?

跟踪:

Traceback (most recent call last):
  File "/home/reuts/PycharmProjects/AI4/Ex4_pydot.py", line 399, in <module>
    driver.interact()
  File "/home/reuts/PycharmProjects/AI4/Ex4_pydot.py", line 362, in interact
    self.parse_command(cmd)
  File "/home/reuts/PycharmProjects/AI4/Ex4_pydot.py", line 354, in parse_command
    options[args[0]]()
  File "/home/reuts/PycharmProjects/AI4/Ex4_pydot.py", line 344, in print_report
    print "node cpt: %s" % node.get_cpt()
AttributeError: 'Node' object has no attribute 'get_cpt'

Node是pydot实现的基类(pydot.Node),最重要的是我继承了pydot.Node时还有两个类。

我现在已经检查了pydot.py中的代码,我怀疑那里有转换。来自Java和静态类型的背景我很难理解get_node_list()中的操作及其对返回实例类型的影响。

1 个答案:

答案 0 :(得分:1)

我可能发现了错误。显然pydot.Node有一个方法无法返回我的预期(pydot是图表实现)。

实际节点存储为字符串,get_nodes()方法为每个get_nodes调用重新生成,这会导致pydot.Node的任何扩展如果稍后通过get_nodes使用,则该类几乎毫无意义。

更新:解决方法

我发现在与实现交互时保存数据的方法是使用Node实例的obj_dict属性,该属性通过图形的obj_dict['nodes'] obj_dict元素进行恢复(为所有添加的节点保存...)