2016-04-08 6 views
0

こんにちは。 私はいくつかのクラスを含むスクリプトをいくつか持っています。私はそれらのクラスを使用して、それらを一緒に働かせるメインスクリプトを持っています、そして、私は別のスクリプトのmain.pyスクリプトで作成されたオブジェクトを使用したい。外部クラスで同じオブジェクトを使用するにはどうすればよいですか?

私のメインでないスクリプトに新しいオブジェクトを作成したくありません。 main.pyで作成された既存のオブジェクトを別のスクリプトで使用したい。

私はGPIOのシリアルポート経由でGSMモデムに接続するので、ATcommandsを使って "話す"ことができます。私はserialClassと私の最新の醜い子供のgsmSMS内のシリアルポート経由で通信できるいくつかの方法があるserial.pyスクリプト、いくつかのピン設定があるpowerOn.pyクラス(私はここに投稿するつもりはない)があります。私はsendSMS、listSMS、delSSpecificSMS、deleteAllSMSなどのsendSMS、receive()メソッドを必要とします。この原稿のオブジェクト。ここ

しかし

は問題です:

マイmain.pyスクリプト(まあ...その一部):

def main(): 
try: 
    global running 
    running = True 
    global atCommandLineOn 
    atCommandLineOn = True 
    with ooGSM.RPiToGsmPins() as modemGSM: 
     with aGsmSerial.serialConnection() as serialGSM: 
      if modemGSM.czyWlaczany==True: 
       sms = aGsmSMS.sms(serialGSM) #THIS WHERE PROBLEM STARTS!!!! 
      else: 
       print("ERROR: Turn on the modem!!!") 
      if atCommandLineOn==True: 
       print("AT command line is ON.") 
      else: 
       print("AT command line is OFF.") 
      while running==True: 
       print("Write command:\n :: ", end="") 
       command = str(input()) 
       menu(command, modemGSM, serialGSM) 
       time.sleep(0.5) 
except OSError: 
    print("asdasdfsdff") 

if __name__ == "__main__": 
    main() 

魔法はメニュー(で起こる)が、それが正常に動作するので、私がいないことを決めましたコードをコピーにする。

これは私のserial.py

再び
class serialConnection(): 
IDLE = 0; SENDING = 1; RECEIVING = 2; 
UNKNOWN = 0; COMPLETE_OK = 1; COMPLETE_ERROR = 2; NOTCOMPLETE = 3; EMPTY = 4; 

def __init__(self, devicePath="/dev/ttyAMA0", timeout=3): 
    self.STATE = ["IDLE", "SENDING", "RECEIVING"] 
    self.STATE_RESPONSE = ["UNKNOWN" ,"COMPLETE_OK", "COMPLETE_ERROR", "NOTCOMPLETE", "EMPTY"] 
    self.mySerial = serial.Serial(devicePath) 
    self.mySerial.timeout = timeout 
    self.state = self.STATE[serialConnection.IDLE] 

def __enter__(self): 
    return self 

def __exit__(self, type, value, traceback): 
    self.mySerial.flushInput() 
    self.mySerial.flushInput() 
    self.mySerial.close() 
    print("Serial connection closed") 

def send(self, message, printWhatIsSent=True): 
    command = message + "\r" 
    if self.state==self.STATE[serialConnection.IDLE] and self.mySerial.isOpen(): #THIS IS WHERE PROGRAM STOPS 
     self.responseState=self.STATE_RESPONSE[serialConnection.UNKNOWN] 
     self.state = self.STATE[serialConnection.SENDING] 
     messageInBytes = self.str2byte(command) 
     self.mySerial.write(messageInBytes) 
     self.mySerial.flushOutput() 
     self.state = self.STATE[serialConnection.IDLE] 
     if printWhatIsSent==True: 
      print(">>>>> Command sent: " + message) 
    else: 
     print("!!!ERROR: Command did not send") 

def str2byte(self, message): 
    return bytearray(message, "ascii") 

def receive(self, saveResponseToFile=True, printResponseStatus=True, printResponse=True): 
    bytesToRead = self.mySerial.inWaiting() 
    responseReadyToSave = "saveResponseToFile=False" 
    if self.state==self.STATE[serialConnection.IDLE] and self.mySerial.isOpen(): 
     self.state = self.STATE[serialConnection.RECEIVING] 
     while self.state==self.STATE[serialConnection.RECEIVING]: 
      modemResponse = "" 
      while self.mySerial.inWaiting() > 0: 
       responseInBytes = self.mySerial.read(bytesToRead) 
       modemResponse += self.byte2str(responseInBytes) 
      self.mySerial.flushInput() 
      self.state = self.STATE[serialConnection.IDLE] 
      if printResponse==True: 
       print("<<<<< received:") 
       print(modemResponse) 
    if self.lookForEndChars(modemResponse)==False: 
     self.isResponseEmpty(modemResponse) 
    if saveResponseToFile==True: 
     responseReadyToSave = self.makeResponseReadyToSave(modemResponse) 
    if printResponseStatus==True: 
     if self.responseState==self.STATE_RESPONSE[serialConnection.NOTCOMPLETE]: 
      print("INFO: End char is missing!!!") 
      print() 
     elif self.responseState==self.STATE_RESPONSE[serialConnection.EMPTY]: 
      print("INFO: Response is EMPTY!!!") 
      print() 
     elif self.responseState==self.STATE_RESPONSE[serialConnection.UNKNOWN]: 
      print("This one should never be printed!!!") 
      print() 
      print() 
     return responseReadyToSave 

、全体ではなくコードです。

そして、私のsms.pyスクリプト: クラスのSMS():

def __init__(self, serialGSMclass): 
    self.setATE0() #AND OFC PROBLEM "GOES" HERE 
    self.setSmsMessageFormat() 
    self.setPrefferedSmsMessageStorage() 

def setATE0(self): 
    command = "ATE0" 
    serialGSMclass.send(self, command) #AND HERE 
    serialGSMclass.receive(self, False, True, False) #QUESTION 2! 
    if serialGSMclass.responseState=="COMPLETE_OK": 
     print("Set to ATE0") 
    else: 
     print("ERROR: Did not set ATE0!!!") 

エラー: 'SMS' オブジェクトが属性状態

を持っていないことは、プログラムがself.state」と "思う" ことを意味し"serialConnection.send()のpython isnt serialConnectionObject.stateではなく、smsObject.stateであり、誰もいないので見つけることができません。右?しかし、どうすればそれを動作させることができますか?

および 質問2: なぜ私は自分自身をsend()に入れなければならないのですか?またはmb私はすべきではない?さて、私はそれを書いているとき、私はそれが問題を引き起こすかもしれないと思う(私はちょっとsmsからserialConnectionに自己を渡すので)!しかし、前に私がこれを好きにしていたので: serialConnectionClass.send(コマンド)と私はこれを持っていた: エラー:send()が欠落していました1必要な位置引数: 'message' send()ただ一つの議論。しかし、send(self、command)は問題を引き起こし、send(command)は動作しません。 :D

+1

これはあまりにも多くの定型文句のようです。あなたの質問のタイトルは簡単ですが、なぜその質問はとても複雑ですか?問題の性質を実際のコードから切り離し、[最小限の例](http://stackoverflow.com/help/mcve)を提供してください。 – timgeb

+0

はsms.pyで、gmsSMS.pyは同じですか? – qvpham

答えて

0

クラスsmsには、パラメータserialGSMclassがあります(与えました)。しかし、あなたは彼と何もしなかった。あなたはその

def __init__(self, serialGSMclass): 
    self.setATE0() #AND OFC PROBLEM "GOES" HERE 
    self.setSmsMessageFormat() 
    self.setPrefferedSmsMessageStorage() 
    self.serialGSMclass = serialGSMclass 

def setATE0(self): 
    command = "ATE0" 
    self.serialGSMclass.send(self, command) #AND HERE 
    self.serialGSMclass.receive(self, False, True, False) #QUESTION 2! 
    if self.serialGSMclass.responseState=="COMPLETE_OK": 
     print("Set to ATE0") 
    else: 
     print("ERROR: Did not set ATE0!!!") 

2のような何かをする必要があります:クラスメソッドでは、クラスインスタンスの変数、メソッド、...を使用する最初のパラメータとしてselfを置く必要があります。 selfがなければ、メソッド定義の上に@staticmethodと書いてください。しかし、クラス変数とメソッドをもう使用することはできません。

例:

class A: 
    def __init__(self, a): 
     self.a = a 

    def print_a(self): 
     print(self.a) 

    @staticmethod 
    def print_a_static(): 
     print(self.a) 

    @staticmethod 
    def print_a_static_2(): 
     print(a) 

a_instance = A(2)    # a_instance is a instance of the class A now and has a variable a=2 
a_instance.print_a()   # print the value of a: 2 
a_instance.print_a_static()  # Exception: unknown self 
a_instance.print_a_static_2() # Exception: unknown a 
+0

はい、あなたは正しいです。 __init__にself.serialGSMclass = serialGSMclassが見つかりませんでした。 – Crixalis

0

Soebodyは私があなたのニックネームを覚えていないごめんなさい..働いていた答えを掲示し、それが削除されます。 は、私が行方不明になった何sms.pyにのinit()スクリプトました:

def __init__(self, serialConnection): 
    if not serialConnection: 
     raise Exception ("invalid serial connection") 
    self.serialConnection = serialConnection 

し、それがうまく働きました。

ああ、申し訳ありません。それはあなただった、ジュリヴィコ?

+0

sr、私は答えをもう一度書きたいと思っていました。私はあなたの2番目の質問を読んでいないので – qvpham

関連する問題