Python在类之间传递对象

2024-09-29 23:33:03 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我想知道如何在课间传递对象。我将使用我的脚本首先登录到我们的服务器,在客户机服务器旁边,然后再登录到路由器和交换机。 脚本如下: 文件名是连接.py公司名称:

    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

以下是使用的脚本:

^{pr2}$

我正在尝试执行以下操作来将子对象传递给ce\u connect类

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

我得到一个错误:

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

Tags: noselfip脚本childusrdefconnect
1条回答
网友
1楼 · 发布于 2024-09-29 23:33:03

您已经成功地将child对象传递给ce_connect构造函数。在

执行此操作时:

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

…将child传递给ce_connect构造函数,因此child2._child与{}是同一个对象。因此,当您调用child2.cjump(),并且该调用self._child.dump(),它在您的child对象上调用djump。就像它应该做的那样。在

问题是child不是domain_connect对象,而是pexpect.spawn对象。这就是为什么你得到了AttributeError: 'spawn' object has no attribute 'djump',这正是它所说的意思。在

原因很简单:

^{pr2}$

这会将child设置为djump返回的值。djump返回的是一个pexpect.spawn对象。在那一行之前,child是一个domain_connect,但是现在,它是一个spawn,并且您不再有对^{的任何可访问的引用。在

答案很简单:不要那样做。保留对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会让您感到困惑。如果你能想出不同的名字,就更容易把事情弄清楚。在


同时,一旦你解决了这个问题,你就有了另一个问题。您的代码似乎希望a ce_connectchild同时是domain_connectapexpect.spawn。特别是,在ce_connect.cjump内,您可以看到:

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

没有domain_connect对象的sendline方法。在

很难决定什么是正确的解决办法。你需要在你的头脑中弄清楚每一个物体应该是什么。为什么它们都叫child?孩子是什么意思?在

一种可能是child对象应该是pexpect子进程,而不是{}对象,所以您真正想要的是这样的:

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成员,然后将{}以及其他方法委托给真正的pexpect对象,如下所示:

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

或者…好吧,就像我说的,有很多种可能性,如果不知道你的设计应该如何工作,你的类和变量应该代表什么,就真的没有办法说如何使你的代码适合你的设计。在

相关问题 更多 >

    热门问题