2013-03-29 97 views
2

嗨,我想知道如何在類之間傳遞obeject。我將使用我的腳本首先登錄到我們的服務器,客戶端服務器旁邊,而不是路由器和交換機。 下面是腳本: 文件名是connect.py:類之間的Python傳遞對象

import expect 
  
class domain_connect: 

     def __init__(self,usr='user',pwd='password',d1='192.168.1.3',dclient='192.168.2.3'): 
     self._usr =us 
        self._pwd =pwd 
        self._d1 =d1 
        self._dclient =dclient 
  
    def djump(self): 
          
     child=pexpect.spawn('ssh -o StrictHostKeyChecking=no -l ' +self._usr+" "+self._d1) 
        child.expect('assword:') 
        child.sendline(self._pwd) 
        child.expect(':~>') 
     ##Connect to client server 
        child.sendline(self._dclient) 
        child.expect('assword:') 
        child.sendline(self._pwd) 
        child.expect('accept:') 
        child.sendline(' ') 
        child.expect(':~>') 
        return child 
  
class ce_connect: 
    def __init__(self, child, ip, usr, pwd, enpwd): 
     self._child = child 
        self._ip = ip 
        self._usr = usr 
        self._pwd = pwd 
        self._enpwd = pwd 
  
    def cjump(self): 
     ##Connecting to router 
      child.sendline('ssh -o StrictHostKeyChecking=no -l '+self._usr+' '+self._ip) 
        return self._child 

下面是使用腳本:

import connect 

child = connect.domain_connect() 
child = child.djump() ## At this point I'm good toward the client server 

我嘗試做以下兒童對象傳遞給ce_connect類

child2 = connect.ce_connect(child, '192.78.1.20', 'username', 'password', 'password2') 
    child2 = child2.cjump() 

我得到一個錯誤:

AttributeError: 'spawn' object has no attribute 'djump' 
+3

請修復縮進。我想我可以猜到什麼是什麼,但我可能是錯的,這可能會讓我的答案錯誤。 (並且它阻止了其他人甚至試圖回答。) – abarnert

回答

5

您已經成功將child對象傳遞給構造函數ce_connect

當你這樣做:

child2 = connect.ce_connect(child, '192.78.1.20', 'username', 'password', 'password2') 

...這傳遞childce_connect構造,所以child2._child結束是相同的對象child。因此,當您致電child2.cjump(),並致電self._child.dump()時,它將在child對象上調用djump。正如它應該的那樣。

的問題是,child不是domain_connect對象,這是一個pexpect.spawn對象。這就是爲什麼你得到那個AttributeError: 'spawn' object has no attribute 'djump',這正是它所說的。

其中的原因很簡單:

child = child.djump() 

這臺child到任何djump回報。 djump返回的是pexpect.spawn對象。在該行之前,childdomain_connect,但現在是spawn,您不再有任何可訪問的參考domain_connect

答案很簡單:不要這樣做。請保留對domain_connect的引用,然後使用它。事情是這樣的:

child = connect.domain_connect() 
child_jump = child.djump() 
child2 = connect.ce_connect(child, '192.78.1.20', 'username', 'password', 'password2') 
child2_jump = child2.cjump() 

作爲一個方面說明,我想重用名稱child方法實現內部和調用代碼混淆你。如果你能想出不同的名字,保持直線會更容易。


同時,一旦你解決這個問題,你有另一個問題。您的代碼似乎預計ce_connectchild同時爲domain_connect a pexpect.spawn。特別是,裏面ce_connect.cjump,你有這樣的:

child.sendline('ssh -o StrictHostKeyChecking=no -l '+self._usr+' '+self._ip) 

有一個domain_connect對象沒有sendline方法。

很難決定什麼是正確的解決方法在這裏。你需要直截了當地理解這些對象應該是什麼。爲什麼他們都被稱爲child?什麼是孩子應該是什麼意思?

一種可能性是,child對象應該是pexpect子進程,而不是*_connect對象,所以你真正想要的是這樣的:

domain = connect.domain_connect() 
child = domain.djump() 
ce = connect.ce_connect(child, '192.78.1.20', 'username', 'password', 'password2') 
child2 = ce.cjump() 

或者,也許你實際上有沒有用對於這些connect對象,僅僅是它們的djump/cjump方法的結果。在這種情況下,你可以把它寫成:

child = connect.domain_connect().djump() 
child2 = connect.ce_connect(child, '192.78.1.20', 'username', 'password', 'password2').cjump() 

但在這種情況下,你可能會更好做公共接口是一對模塊級的功能,並隱藏的實施下的類功能。

或者,也許你想讓domain_connect對象作爲對他們所代表任何其他頂級子進程,通過抓着的djump結果作爲_child成員,則委託sendline,也許等方法,真正的pexpect對象,像這樣:

def sendline(self, line): 
    return self._child.sendline(line) 

還是......好了,正如我所說,有很多可能性,並且不知道你的設計是如何工作的,你的類和變量都應該代表什麼,真的沒有如何讓你的代碼適合你的設計。

+0

我得到這個錯誤: – amb1s1

+0

回溯(最近呼叫最後): 文件「」,第1行,在 文件「connect.py」,第38行,在cjump中 self._child.sendline('ssh -o StrictHostKeyChecking = no -l'+ self._usr +''+ self._ip) AttributeError:domain_connect實例沒有屬性'sendline' – amb1s1

+0

這是因爲代碼中存在另一個錯誤。我會編輯答案來嘗試解釋。 – abarnert