gpt4 book ai didi

类之间的Python传递对象

转载 作者:行者123 更新时间:2023-11-28 21:59:59 26 4
gpt4 key购买 nike

您好,我想知道如何在类之间传递对象。我将使用我的脚本首先登录到我们的服务器,然后是客户端服务器,而不是路由器和交换机。这是脚本:文件名为 connect.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

这是使用的脚本:

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'

最佳答案

您已经成功通过了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() ,它正在调用 djump在你的 child目的。正如它应该的那样。

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

原因很简单:

child = child.djump()

这设置了 child随便什么djump返回。什么djump返回是 pexpect.spawn目的。在那行之前,child是一个domain_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在方法实现内部和调用代码中会让您感到困惑。如果您能想出不同的名称,就更容易把事情弄清楚。


与此同时,一旦你解决了这个问题,你就会遇到另一个问题。您的代码似乎期望 childce_connect既是domain_connect 一个pexpect.spawn同时。特别是里面ce_connect.cjump ,你有这个:

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

没有 sendline domain_connect 的方法对象。

很难确定此处的正确修复方法。您需要在头脑中弄清楚这些对象中的每一个应该是什么。为什么都叫child ? 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()

但在那种情况下,您最好将公共(public)接口(interface)设为一对模块级函数,并隐藏这些函数实现下的类。

或者,也许你想让 domain_connect通过保留 djump 的结果,对象充当它们所代表的任何其他对象之上的子进程。作为 _child成员,然后委派sendline ,也许还有其他方法,到真正的pexpect对象,像这样:

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

或者……好吧,就像我说的,有很多可能性,并且在不知道您的设计应该如何工作以及您的类和变量应该代表什么的情况下,真的没有办法说出如何让您的代码适合您的需求设计。

关于类之间的Python传递对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15712537/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com