关于oop:只为python中的所有对象创建一个会话

Create one session only for all objects in python

我正在尝试使用pexpect创建一个类来连接到box,并从该框中获取一些数据,我很难创建一个函数,该函数包含我的box的pexpect会话,并为我在下面的类代码示例中创建的每个对象初始化它。

1
2
3
4
5
6
7
8
9
10
11
12
class A:
   def __init__(self)
       # in this way a session will be created for each object and i don't
       # need that i need only one session to open for any object created.
       session = pexpect.spawn('ssh myhost')
       session.expect('myname@myhost#')

   def get_some_data(self,command)
       session.sendline(command)
       session.expect('myname@myhost#')
       list = session.before.splitlines()
       return list

现在我的问题是,如果我真的创建了一个新的对象,将为每个对象创建一个新的会话,而这不是必需的,我只能为从这个类创建的每个对象使用一个会话。


您可以使用类方法来连接和设置pexpect实例(子)的类变量。那么这个类中的实例方法可以使用这个类变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import pexpect

class Comms:
    Is_connected = False
    Name = None
    ssh = None

    @classmethod
    def connect(cls, name):
        cls.Name = name
        cls.ssh = pexpect.spawn('ssh ' + name)
        cls.ssh.expect('password:')
        cls.ssh.sendline('*****')
        cls.ssh.expect('> ')
        print cls.ssh.before, cls.ssh.after
        cls.Is_connected = True

    @classmethod
    def close(cls):
        cls.ssh.close()
        cls.ssh, cls.Is_connected = None, False

    def check_conn(self):
        print self.Name + ' is ' + str(self.Is_connected)
        return self.Is_connected

    def cmd(self, command):
        self.ssh.sendline(command)
        self.ssh.expect('> ')
        return self.ssh.before + self.ssh.after

实例方法中使用的self.ssh是一种在类内使用类变量的方法,如果它没有赋值给。如果它被分配给它,那么将创建一个同名的实例变量。在这种情况下,这是不可能发生的,因为在这个类中没有理由分配给ssh

类方法将类作为隐式参数接收,因此可以使用cls.ssh。在实例方法中,还可以获取对类的引用,然后使用cls.ssh

1
2
3
4
def cmd(self, command):
    cls = self.__class__
    cls.ssh.sendline(command)
    ...

类变量可以作为Comms.ssh在任何地方使用。这是一个相当简单的类。

现在使用class方法连接到主机并通过不同的实例运行命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from comms import Comms

userathost = 'xxx@xxxxx'

print 'Connect to ' + userathost
Comms.connect(userathost)

conn_1 = Comms()
conn_1.check_conn()
print conn_1.cmd('whoami')
print

conn_2 = Comms()
print 'With another instance object: pwd:'
print conn_2.cmd('pwd')

Comms.close()

[description]中为个人细节修改了哪些印刷品?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Connect to xxx@xxxxx

Last login: Sat Aug 12 01:04:52 2017 from *****
[... typical greeting on this host]
[my prompt] >
xxx@xxxxx is True
whoami
[my username]
[my prompt] >

With another instance object: pwd:
pwd
[path to my home]
[my prompt] >

连接应该设置得更好,输出处理得更好,但这是关于pexpect

有关类/静态方法和变量的信息,请参见

  • python中的静态类变量

  • 在Python中,如何访问类方法中的"静态"类变量

  • 类__init_uu()函数内部和外部的变量

  • 在Python中,"类方法"和"实例方法"是什么?

  • 在python中访问类的成员变量?