【问题标题】:Python: Using dictionaries from parent class in subclassPython:在子类中使用父类中的字典
【发布时间】:2013-10-29 23:47:08
【问题描述】:

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

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

尝试使用“graph.(tab completion)”时无法使用Summary中的功能,所以这就是我遇到的问题。

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

【问题讨论】:

  • 这是一个奇怪的设计。为什么Summary 继承自Graph?摘要不是图表;您对图表进行的摘要。

标签: python class inheritance subclass


【解决方案1】:

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

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

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 会有你想要的方法。

您的代码中的其他一些 cmets:

  • 你的行非常非常长。您可以将任意位置用括号括起来,或者使用临时变量代替相同的长表达式两次。

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

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

  • 你的变量名通常有点难以理解:d vs d1 vs d2,以及hist vs histogram。评论也会有所帮助。

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

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

【讨论】:

  • 哇,你让我无语了。非常感谢!
【解决方案2】:

一般来说,Summary 继承了Graph 的所有字段和方法。所以您可以在Summary 中访问self.graphself.nodes。您是否尝试过访问这些字段?如果它不起作用,是什么错误?

【讨论】:

  • 当我这样做时,Summary 中的函数不可用,图表。(制表符补全)。
  • 1.你试过self.graph吗? 2. 你用什么编辑器? 3. 有可能代码补全不起作用,但代码是正确的。
  • 我正在使用 Ipython 控制台。当我做图表(制表符补全)时,我在第一堂课中创建的所有字典都会显示出来并很好地输出。
  • 我认为你误解了继承。 graphGraph,而不是 Summary。它对Summary一无所知。
  • @Eevee,所以在 Graph 类中有我想在 Summary 子类中使用的字典。我可以让它在一个类中使用所有这些,但我想使用多个类。
猜你喜欢
  • 2017-07-01
  • 1970-01-01
  • 2020-06-11
  • 2016-01-18
  • 1970-01-01
  • 2018-10-31
  • 2012-04-23
  • 2019-02-05
  • 1970-01-01
相关资源
最近更新 更多