2017-02-07 2 views
0

Ich habe ein Problem beim Zugriff auf client.close() in readholdingregisters() von Closeconnection() in dem folgenden Code:Zugriffsmethode Variable aus anderen Methode Python

class EnergyMeter: 
    def __init__(self, model, gatewayipaddress, port ,deviceid): 
     self.model = model 
     self.gatewayipaddress = gatewayipaddress 
     self.port = port 
     self.deviceid = deviceid 

    def readholdingregisters(self, startingregister, numberofregisters): 
     from pymodbus3.client.sync import ModbusTcpClient as ModbusClient 
     client = ModbusClient(self.gatewayipaddress, port=self.port) 
     client.connect() 
     if #some code here: 
      #some other code here 
      return concatResult 
     else: 
      return otherResult 

Hier habe ich die Verbindung client.connect schließen möchten() aus readholdingRegisters():

def closeconnection(self): 
     EnergyMeter.readholdingregisters().client.close()?????????????????? 

Können Sie mir bitte eine gute Lösung, wie es geht?

+3

Speichern Sie die Verbindung auf der Instanz genau wie Sie mit Ihren anderen Daten ... – kindall

+0

Ich bin mir nicht sicher, ob ich verstehe, was Sie meinen. Kannst du ein kleines Beispiel schreiben? – KaloyanGeorgiev

+0

'self.client = client' – kindall

Antwort

0

Üblicher Ansatz ist, Client als Datamember der Klasse zu machen.

 self.client = ModbusClient(self.gatewayipaddress, port=self.port) 
     self.client.connect() 
     #some code here 


    def closeconnection(self): 
     self.readholdingregisters() 
     self.client.close() 

Allerdings, wenn Sie Methode durch Klasse zugreifen möchten EnergyMeter.readholdingregisters()

Dann sollte es als staticmethod oder classmethod und diese Methode sollte Instanz zurückgeben Client deklariert werden. Link

0
from pymodbus3.client.sync import ModbusTcpClient as ModbusClient 

class EnergyMeter: 
    def __init__(self, model, gatewayipaddress, port ,deviceid): 
     self.model = model 
     self.gatewayipaddress = gatewayipaddress 
     self.port = port 
     self.deviceid = deviceid 
     self.client = ModbusClient(self.gatewayipaddress, port=self.port) 
     self.client.connect() 

    def readholdingregisters(self, startingregister, numberofregisters): 
     if #some code here: 
      #some other code here 
      return concatResult 
     else: 
      return otherResult 

Dann schließen Sie anrufen, energy_meter.client.close() für was auch immer energy_meter Sie schließen möchten.

+0

Vielen Dank :) Sehr gute Antwort! – KaloyanGeorgiev

+0

@KaloyanGeorgiev Wenn Ihr Problem gelöst wurde, vergessen Sie nicht, das Häkchen bei "Antwort annehmen" zu aktivieren. Antworten, die Sie als hilfreich empfunden haben (einschließlich Ihrer angenommenen Antwort) – TemporalWolf

Verwandte Themen