In [2]:
class Vertex:
    def __init__(self, name):
        self.name = name
    def getName(self):
        return self.name
    def __str__(self):
        return self.name

In [9]:
class Edge:
    def __init__(self, src, dst, weight = 0):
        self.src = src
        self.dst = dst
        self.weight = weight
    def getSrc(self):
        return self.src
    def getDst(self):
        return self.dst
    def getWeight(self):
        return self.weight
    def __str__(self):
        return str(self.src) + "->" + str(self.dst)

In [5]:
class Digraph:
    def __init__(self):
        self.vertices = set([])
        self.edges = {}
    def addVertex(self, vertex):
        if vertex.getName() in self.vertices:
            raise ValueError('Duplicate Vertex')
        else:
            self.vertices.add(vertex)
            self.edges[vertex] = []
    def addEdge(self, edge):
        src = edge.getSrc()
        dst = edge.getDst()
        if not(src in self.vertices and dst in self.vertices):
            raise ValueError('Vertex not in graph')
        self.edges[src].append(dst)
    def childrenOf(self, vertex):
        return self.edges[vertex]
    def hasVertex(self, vertex):
        return vertex in self.vertices
    def __str__(self):
        res = ''
        for k in self.edges:
            for d in self.edges[k]:
                res = res + str(k) + '->' + str(d) + '\n'
        return res[:-1]

In [6]:
class Graph(Digraph):
    def addEdge(self, edge):
        Digraph.addEdge(self, edge)
        rev = Edge(edge.getDestination(), edge.getSource())
        Digraph.addEdge(self, rev)

In [10]:
def test1(kind):
    vertices = []
    for name in range(10):
        vertices.append(Vertex(str(name)))
    g = kind()
    for n in vertices:
        g.addVertex(n)
    g.addEdge(Edge(vertices[0],vertices[1]))
    g.addEdge(Edge(vertices[1],vertices[2]))
    g.addEdge(Edge(vertices[2],vertices[3]))
    g.addEdge(Edge(vertices[3],vertices[4]))
    g.addEdge(Edge(vertices[3],vertices[5]))
    g.addEdge(Edge(vertices[0],vertices[2]))
    g.addEdge(Edge(vertices[1],vertices[1]))
    g.addEdge(Edge(vertices[1],vertices[0]))
    g.addEdge(Edge(vertices[4],vertices[0]))
    print('The graph:')
    print(g)

test1(Digraph)
##test1(Graph)


The graph:
0->1
0->2
1->2
1->1
1->0
2->3
3->4
3->5
4->0

In [ ]: