2011-10-30 27 views
1

ネットワークプログラミング、スレッド化、OOPスキルに取り組んでいるように感じました。私は問題に遭遇しました。 私はIRCというクラスとPongというクラスを持っています。私はIRCを使ってサーバへの接続、メッセージの送信などをしたいと思っています。「PING」を含むメッセージをチェックするバックグラウンドでスレッドとしてPongを使用したいと思います。Pythonで2つのクラス間で変数を共有する

class IRC: 
    def Connect(self): 
     try: 
      HOST = sys.argv[1] 
      PORT = sys.argv[2] 
     except IndexError: 
      print "Usage: "+sys.argv[0]+" [server] [port]\n" 
      sys.exit(1) 
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     s.connect((HOST, PORT)) 

class Pong(threading.Thread): 
    def Pong(self): 
     while 1: 
      IRC.s.send("Test") # IRC has no attribute 's' 

上記のコードが簡素化され、テスト目的のみのために、私の質問は、私は別のクラスから1クラスで変数を使用することができる方法であることに留意してください。変数sはIRCで宣言され定義されていますが、Pongでも必要です。 インタプリタは、クラスIRCに属性 's'がないことを訴えています(私はConnect()を最初にサンプル変数で呼び出そうとしましたが、そうではありません)。

どうすれば解決できますか?スレッディングとオブジェクトの向きについては、私は新しいです。

ありがとうございます!

+0

あなたが実際にあなたのオブジェクトに属性を追加することを確認してください。現在、 's'はローカル変数として定義されています。多分 's'を' self.s = socket.socket(...) 'と定義したいでしょうか? –

+0

@JeffMercadoご意見ありがとうございます。私は変数に 'self'を追加しようとしましたが、うまくいきませんでした。 – Griffin

+0

まあ問題は、あなたの 'IRC'クラスのインスタンスを作成する必要がありますが、あなたはクラス変数にアクセスしようとしています(' IRC.s'を実行しています)。基本的なOOPの原則やPythonを一般的に説明することをお勧めします。 –

答えて

3

あなたはPONGコンストラクタに渡すことができますIRCクラスのインスタンスを呼び出す必要があります:

class IRC: 
    def Connect(self): 
     try: 
      HOST = sys.argv[1] 
      PORT = sys.argv[2] 
     except IndexError: 
      print "Usage: "+sys.argv[0]+" [server] [port]\n" 
      sys.exit(1) 
     self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.s.connect((HOST, PORT)) 

class Pong(threading.Thread): 
    def __init__(self,ircclass): 
     self.myirc = ircclass 
    def Pong(self): 
     while 1: 
      self.myirc.s.send("Test") 

gIRC = IRC 
gIRC.connect() 
myPong = Pong(gIRC) 

など

+0

ありがとうございます。私はコードを実装する方法がわかりませんが、ドキュメントをチェックしたところ、クラスを初期化するときにパラメータを追加する必要があるようです。私は 'class PONG(threading.Thread)'を持っていても動作しますか?また、実際にはイスクラスには何が含まれていますか? – Griffin

+0

例を少し拡張しました。ドキュメントの正しい部分を読んでいます。はいPong(threading.Thread)はThreadクラスを拡張しています。ircclassは修正された例のようにIRCクラスのインスタンスにする必要があります。 – Mud

+0

この例では、エラー 'NameError:global name 'myirc' not defined'が返されます。 – Griffin

関連する問題