【问题标题】:TypeError: open_ssh_tunnel() missing 1 required positional argument: 'self'类型错误:open_ssh_tunnel() 缺少 1 个必需的位置参数:'self'
【发布时间】:2021-09-21 21:30:42
【问题描述】:

所以我知道这个问题已被问过很多次,但我似乎无法 明白我需要做什么 放入 init 定义。当我调用 open_ssh_tunnel 函数时。错误 类型错误:open_ssh_tunnel() 缺少 1 个必需的位置参数:'self'。 任何帮助将不胜感激。

def __init__(self):
    ???

def open_ssh_tunnel(self, verbose=False):
    """Open an SSH tunnel and connect using a username and password.
    :param verbose: Set to True to show logging
    :return tunnel: Global SSH tunnel connection
    """
    if verbose:
        sshtunnel.DEFAULT_LOGLEVEL = logging.DEBUG

    global tunnel
    tunnel = SSHTunnelForwarder(
        (self.ssh_host, 22),
        ssh_username= self.ssh_username,
        ssh_password= self.ssh_password,
        remote_bind_address=('127.0.0.1', 3306)
    )
    tunnel.start()

【问题讨论】:

  • 这能回答你的问题吗? What __init__ and self do in Python?
  • 我建议您先探索基本的 oop,然后再尝试学习会使您的工作更加困难的“大块”知识。

标签: python init self


【解决方案1】:

根据您在 open_ssh_tunnel 中的代码,您似乎正在使用 3 个实例变量 ssh_hostssh_usernamessh_password。这些实例变量应该在您的__init__ 方法中定义,因为您使用self 调用它们。比如:

class SSHExample:
  def __init__(self):
    self.ssh_host = "<insert ssh host value>"
    self.ssh_username = "<insert username value>"
    self.ssh_password = "<insert password value>"

更有可能的是,您在初始化对象时必须传入这 3 个值,因为主机、用户名和密码并不总是相同的值。所以__init__ 方法看起来像:

def __init__(self, host, username, password):
  self.ssh_host = host
  self.ssh_username = username
  self.ssh_password = password

这三个实例变量随后将在您定义的open_ssh_tunnel 方法中使用。

self 本身是一个实例变量,它引用您已初始化的对象。您只能使用它在类的其他方法中调用对象的其他实例变量。使用上面的第二个 __init__ 进行初始化的示例如下所示:

ssh_obj = SSHExample('fake_host', 'fake_user', 'fake_pass')
print(ssh_obj.ssh_host) # prints "fake_host"
print(ssh_obj.ssh_username) # prints "fake_user"

【讨论】:

  • 非常感谢您对我的帮助很大 + 我终于明白了 init 功能。非常感谢,这让我发疯了;))
  • 很高兴听到它:)
猜你喜欢
  • 2022-01-03
  • 2021-07-14
  • 2015-07-13
  • 2019-10-02
  • 2017-06-24
  • 2016-05-27
  • 2017-08-21
  • 2020-11-10
  • 2018-04-05
相关资源
最近更新 更多