Наследование класса mqtt Initializer без инициализации метода client.connect и loop_start -django

у меня есть класс инициализатора mqtt

class Initializer():
  def __init__(self):
     self.client = mqtt.Client(mqtt_server+str(int(time.time()))) 
     self.client.username_pw_set(
         username=mqtt_username, password=mqtt_password)
     self.client.on_connect = self.on_connect
     self.client.subscribe(
        "topic")
     self.client.connect(broker, mqtt_port)
     self.client.loop_start()

наследовал этот класс другому классу

    class publishdata(Initializer):
         def __init__(self):
            super().__init__()
            self.client.on_message = self.on_message
            self.client.on_subscribe = self.on_subscribe
        def on_subscribe(self, client, userdata, mid, granted_qos):
                print("Subscription started")
        def on_message(self, client, userdata, message):
            print("message.topic", message.payload)
        def begin(self,topic,data):
            self.client.publish(
                topic, str(data))
    publishData = PublishData()
    publishData.begin(topic,data)

Публикация и подписка работают правильно. но когда я вызываю publishedData .client.connect и client.loop_start в классе Initializer также выполняются. я не хочу, чтобы это выполнялось при каждом вызове публикации. есть ли лучший способ сделать это

Если вы не хотите инициализировать клиента каждый раз при создании нового экземпляра PublishData, то код, выполняющий эту инициализацию, не должен находиться в классе PublishData. Одно из возможных решений - создать клиента вне класса PublishData и передать его в класс. Это называется инъекцией зависимостей. Это выглядит примерно так:

def start_client():
    client = mqtt.Client(mqtt_server+str(int(time.time()))) 
    client.username_pw_set(username=mqtt_username, password=mqtt_password)
    client.on_connect = self.on_connect
    client.subscribe("topic")
    client.connect(broker, mqtt_port)
    client.loop_start()
    return client


client = start_client()
publish_data = PublishData(client)
publishData.begin(topic,data)
Вернуться на верх