2011-10-30 135 views
1

我覺得我的網絡編程,線程和麪向對象的技能。但我遇到了一個問題。 我有一個名爲IRC的類和一個名爲Pong的類。我想使用IRC來完成連接到服務器,發送消息等內容。我想在後臺使用Pong作爲線程,檢查包含「PING」的消息。在Python中的兩個類之間共享變量

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' 

記住上面的代碼簡化,僅用於測試目的,我的問題是如何在一個類中使用變量從另一個類。變量s在IRC中被聲明和定義,但在Pong中也是需要的。 解釋器抱怨IRC類沒有屬性'(我試着先用一個示例變量調用Connect()來查看它是否工作,但它沒有)。

我該如何解決這個問題?在線程和麪向對象方面,我是新手。

在此先感謝!

+0

確保你真正的屬性添加到您的對象。現在,'s'被定義爲一個局部變量。也許你想把's'定義爲:'self.s = socket.socket(...)'? –

+0

@JeffMercado感謝您的評論。我只是試圖給變量添加'self',但它沒有工作。 – Griffin

+0

那麼問題最終是你應該創建你的IRC類的實例,但你試圖訪問一個類變量(做'IRC.s')。我強烈建議你在繼續之前,先回顧一下基本的OOP原則和Python。 –

回答

3

你需要調用IRC類的實例,你可以傳遞給PONG構造:

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

謝謝你的回答。我不確定如何在我的代碼中實現它,但是我檢查了文檔,並且似乎在初始化我的類時必須添加參數。即使當我有'PONG(線程線程)'類時,它會工作嗎?另外,還應該包含什麼? – Griffin

+0

我爲你擴展了這個例子,你正在閱讀正確的文檔,是的Pong(threading.Thread)只是說它擴展了Thread類,ircclass應該是IRC類的一個實例,就像修改後的例子一樣。 – Mud

+0

你的例子返回錯誤'NameError:全局名'myirc'未定義'。 – Griffin