<p>正确的做法是允许<code>Graph</code>类将用户定义的类作为参数,并使用它来表示顶点。您的<code>graph</code>模块可以提供适当的默认值。你知道吗</p>
<p>在<code>graph.py</code>(模块应以小写字母开头):</p>
<pre><code>class Vertex(object):
def __init__(self,key):
self.id = key
self.connectedTo = {}
class Graph(object):
def __init__(self, vertexclass=Vertex):
self.vertList = {}
self.numVertices = 0
self.vertexclass = vertexclass
def addVertex(self,key):
self.numVertices += 1
newVert = self.vertexclass(key)
self.vertList[key] = newVert
return newVert
def getVertex(self,k):
if k in self.vertList:
return self.vertList[k]
else:
return None
</code></pre>
<p>唯一的变化是<code>Graph.__init__</code>有一个默认值为纯<code>Vertex</code>类的参数,允许您在创建<code>Graph</code>实例时传递另一个类。该类被保存,并且在调用<code>addVertex</code>创建新顶点时使用该类。你知道吗</p>
<p>然后,在要使用自定义顶点类的另一个模块或脚本中:</p>
<pre><code>#!/usr/bin/python
import graph
class MyVertex(graph.Vertex):
def __init__(self,key):
super(Vertex,self).__init__(key)
# extensions for BFS
self.predecessor = None
self.dist = 0
self.color = 'w' # white, grey, and black
class BFSGraph(Graph):
def __init__(self):
super(BFSGraph, self).__init__(MyVertex)
def getColor(self,k):
return self.getVertex(k).color
def test():
g=BFSGraph()
g.addVertex('a')
g.getColor('a')
</code></pre>
<p>调用<code>BFSGraph.__init__</code>时,只需使用要使用的<code>graph.Vertex</code>子类调用其父类的<code>__init__</code>。你知道吗</p>
<p>这不是组织代码的唯一方法,但要记住的关键是<code>Graph</code>类(或从中派生的任何子类)应该准确地记录实现vertex的类需要实现的行为。你知道吗</p>