0

我想使用父类“Graph”中的字典并在名为“Summary”的子类中使用它。

字典是节点、度数、邻居、直方图和图。

尝试使用“graph.(tab completion)”时无法使用摘要中的函数,这就是我遇到的问题。

我是python和一般编程的新手,所以我不知道我想做的事情是否可行。

class Graph:
    '''docstring'''

    def __init__(self, graph):

        d = {}
        d1 = {}
        d2 ={}
        with myfile as f:
            next(f)
            for line in f:
                k, v = line.split()
                d[int(k)] = int(v)
                next(f)

            myfile.seek(0)

            data = [line.strip() for line in myfile]
            d1 = dict(enumerate(data))

            del d1[0]

            d2 = {key: list(map(int, value.split())) for key, value in d1.items()}

            i = 1
            while i <= max(d2.keys()):
                del d2[i]
                i += 2

            neighbors = dict(enumerate(d2.values(), start = 1))


        hist = defaultdict(list)
        for key, values in neighbors.iteritems():
            hist[len(values)].append(key)
        histogram = dict(hist)

        degree = d.values()
        nodes = d.keys()

        self.graph = graph
        self.nodes = nodes
        self.degree = degree
        self.neighbors = neighbors
        self.histogram = histogram

class Summary(Graph):
    def __init__(self, graph):
        Graph.__init__(self, graph)

    def Avg_Connectivity(self):


        return ("Average Node Connectivity:", np.average(self.degree))

    def Max_Connectivity(self):

        return ("Maximum Node Connectivity:" , max(self.degree)),("Node with Maximum Connectivity:", self.nodes[self.degree.index(max(self.degree))]) 

    def Min_Connectivity(self):
        return ("Minimum Node Connectivity:", min(x for x in self.histogram.keys() if x != 0)),("Nodes with Minimum Connectivity", self.histogram[min(x for x in self.histogram.keys() if x != 0)])


if __name__ == '__main__':

    import numpy as np
    from collections import defaultdict
    infile = raw_input("Enter File Name (e.g. e06.gal): ")
    myfile = open(infile, 'r')
    graph = Graph(myfile)
4

2 回答 2

0

通常,Summary从 继承所有字段和方法Graph。这样您就可以访问self.graphself.nodesSummary. 您是否尝试过访问这些字段?如果它不起作用,错误是什么?

于 2013-10-29T23:51:57.430 回答
0

根据评论,您没有Summary在任何地方使用。你有一个Graph对象。子类向现有类“添加”新方法,但它们只存在于类中,而不存在于您继承的类中。

无论如何,继承对于这个问题来说是一个糟糕的选择。“摘要”不是“图表”的特例。您需要一个包装图形的单独对象。

class Summary(object):
    def __init__(self, graph):
        self.graph = graph

    def avg_connectivity(self):
        return ("Average Node Connectivity:", np.average(self.graph.degree))

    # ... etc


if __name__ == '__main__':
    import numpy as np
    infile = raw_input("Enter File Name (e.g. e06.gal): ")
    myfile = open(infile, 'r')
    graph = Graph(myfile)
    summary = Summary(graph)

调整要使用的其他方法,self.graph而不是self直接调整属性。现在summary将有你想要的方法。

对您的代码的其他一些评论:

  • 你的队伍非常非常长。您可以将任何地方括在括号中,或者使用临时变量代替相同的长表达式两次。

  • Foo_Bar是一种非常不寻常的命名方式;只是保持小写。

  • 您的Graph构造函数获取一个打开的文件(名称令人困惑graph),然后将其保存为self.graph. 你可能不需要这样做。

  • 一般来说,您的变量名称有点难以理解:dvs d1vsd2histvs histogram。评论也会有所帮助。

  • 你应该把你import放在文件的顶部,而不是放在底部的这个块中。

  • 这种文件格式有成对的行吗?阅读有点复杂;我同情 :)

于 2013-10-30T00:26:38.560 回答