Does this design represent circular dependency?

Advertisements

Imagine this example (that may be run without any errors):

from random import uniform

class Car:    
    def __init__(self, position):
        self.position = position
        self.sensor = Sensor(id, self)

class Sensor:
    def __init__(self, id, carrier_car):
        self.id = id
        self.position = self.compute_position(carrier_car)

    def compute_position(self, carrier_car):
        return [carrier_car.position[0] + uniform(1,3), carrier_car.position[0] + uniform(2,4)]
        
car1 = Car([10,10])
print("This car's sensor coordinate is ({},{}).".format(car1.sensor.position[0], car1.sensor.position[1]))

Question 1.

Given the line self.sensor = Sensor(id, self), I don’t understand how this line executes without any problem. Isn’t this circular dependency? (self, in the argument, is an object of Car which has not yet been completely created (initialized) at the point it is passed to the initializer of Sensor.)

Question 2.

If this a circular dependency, how can I resolve it?

>Solution :

The self object that is passed to Sensor(id, self) is an already existing Car instance, but it does not have a sensor attribute yet.

Since Sensor only requires the position attribute of the carrier_car object, this is not a problem, since it has already been created in the line self.position = position.

In any case, this design is a bit confusing. I would not pass a Car object to Sensor, but just a position, as this is all that Sensor needs to know about the car. This would also simplify the code:

from random import uniform

class Car:    
    def __init__(self, position):
        self.position = position
        self.sensor = Sensor(id, position)

class Sensor:
    def __init__(self, id, position):
        self.id = id
        self.position = self.compute_position(position)

    def compute_position(self, position):
        return [position[0] + uniform(1,3), position[0] + uniform(2,4)]
        
car1 = Car([10,10])
print("This car's sensor coordinate is ({},{}).".format(car1.sensor.position[0], car1.sensor.position[1]))

Leave a ReplyCancel reply