【问题标题】:Initializing an object using another object in Python在 Python 中使用另一个对象初始化一个对象
【发布时间】:2018-11-26 14:57:50
【问题描述】:

我有以下代码:

import xmlrpc.client as xc
class AristaSwitch():
    def __init__(self,devicename,user='admin',password='xxxxxx')
        self.url="https://"+user+":"+password+"@"+devicename+"/command-api"
        self.Server = xc.Server(self.url)     **<----i know this is not correct** 
    more code below here

我希望能够编写如下代码:

as = AristaSwitch("192.168.1.1")
as.runCmds(1, [ "show hostname" ] )

他们这样做的方式是:

import xmlrpc.client as xc
switch = xc.Server( "https://admin:admin@172.16.130.16/command-api" ) 
response = switch.runCmds( 1, [ "show hostname" ] ) 

更新 我认为将其添加到 init 函数中应该可以做到这一点

    self.InitializeRPCServer()
def InitializeRPCServer():
    switch=xc.Server(self.url)
    return switch

【问题讨论】:

  • 大概你的意思是def __init__在你的班级,而不仅仅是__init__
  • 是的,这是正确的
  • 我在 def 规则的末尾缺少一个 : ...
  • 我没有看到手头的问题。你清楚地知道参数是如何工作的,所以你可以要求 IP 参数(在我添加的括号中),然后将其用作 IP,然后它应该可以工作......不是我擅长这个。我讨厌参数,我只是一个业余爱好者,

标签: python oop methods


【解决方案1】:

看来您只是想绕过xc.Server。只需使用函数而不是类。

import xmlrpc.client as xc
def AristaSwitch(devicename, user='admin', password='xxxxxx'):
    url="https://"+user+":"+password+"@"+devicename+"/command-api"
    Server = xc.Server(url)
    return Server

那就做你的事吧:

as = AristaSwitch("192.168.1.1")
as.runCmds(1, [ "show hostname" ] )

如果您正在谈论自定义 xc.Server 对象,您可以直接继承它:

class AristaSwitch(xc.Server):
    def __init__(self, devicename, user='admin', password='xxxxxx'):
        self.url="https://"+user+":"+password+"@"+devicename+"/command-api"
        super().__init__(self.url)

您需要将def __init__ 更新为自定义的url 输入,但您应该对原始实现相当了解,因为您可能无意中覆盖了超类xc.Server 中的某些属性或实现细节。

对于这个用例,AristaSwitch 基本上是带有自定义实例化方法的xc.Server,如果您愿意,以后可以使用自己的方法对其进行补充。

【讨论】:

  • 重点是创建一个我以后可以改进和构建的对象,而不仅仅是运行一个创建对象的简单函数
  • 是的,这就是稍后改进对象并隐藏初始服务器方法的重点。我想让该类与其他对象相似(其他供应商 REST API 封装类似)
  • 该函数实际上将返回 xc.Server 对象,其中包含用于实例化的自定义 url。看来我的答案正是您想要实现的目标,除非有一些我不理解的基本内容。你在想什么样的改进?在这种情况下,您可能只想将xc.Server 继承到AristaSwitch
  • 我希望以后能够向 AristaSwitch 添加更多方法。您建议我应该这样做的方式是创建一个 RPC 服务器对象,而不是具有 runCmds 方法以及其他方法的开关对象
  • 好的,看我编辑的答案(第二部分),它可能更多的是你的想法。
猜你喜欢
  • 2016-05-30
  • 2017-01-16
  • 1970-01-01
  • 2022-11-20
  • 1970-01-01
  • 2016-04-09
  • 2016-12-18
  • 1970-01-01
  • 2016-08-23
相关资源
最近更新 更多