Classes referencing each other

Ryan Ginstrom ginstrom at tree.odn.ne.jp
Mon Nov 6 04:39:37 EST 2006


> Behalf Of Manuel Bleichner
> In a module I have a huge number of classes of the form:
> 
> class A(object):
>    connected_to = [B, C]
>    <other attributes...>
> 
> class B(object)
>    connected_to = [C]
>    <other attributes...>
> 
> class C(object)
>    connected_to = [A]
>    <other attributes...>
> 
> As you see, classes A and B reference classes that are not 
> yet defined when the class is being defined.
> It will raise a NameError: 'B'.

How about a connection broker?

Simple example:

#############################
connections = {}

def Register( obj ):
	try:
		connections[obj.name]['obj'] = obj
	except KeyError:
		connections[obj.name] = { 'obj' : obj, 'connected_to' : [] }

def ConnectTo( objname, obj ):
	try:
		connections[objname]['connected_to'].append( obj )
	except KeyError:
		connections[objname] = { 'obj' : None, 'connected_to' :
[obj] }

class ConnectionObject:
	def __str__(self):
		return self.name

class A(ConnectionObject):
    def __init__(self):
        self.name = 'A'
        Register( self )
        ConnectTo( 'B', self )


class B(ConnectionObject):
    def __init__(self):
        self.name = 'B'
        Register( self )
        ConnectTo( 'A', self )
        ConnectTo( 'C', self )


class C(ConnectionObject):
    def __init__(self):
        self.name = 'C'
        Register( self )
        ConnectTo( 'A', self )


a = A()
b = B()
c = C()


for (key, val) in connections.iteritems():
    print 'object: %s (%s)' % ( key, val['obj'] )
    str_vals = []
    for obj in val['connected_to']:
        str_vals.append( str( obj ) )
    print '\tconnections from:', str_vals

#############################
Output:

object: A (A)
	connections from: ['B', 'C']
object: C (C)
	connections from: ['B']
object: B (B)
	connections from: ['A']
object: D (None)
	connections from: ['C']

Regards,
Ryan Ginstrom




More information about the Python-list mailing list