2013-03-29 96 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