在整个模块中使用对象。Python

user1920217

当我以某种方法创建对象时,不能在任何其他方法中使用它。因此,对象的使用仅限于该方法。但是我想以某种方式创建对象,可以在整个模块中使用它。

这是我要在其中创建对象的模块的代码,以便可以在每种方法中使用它。(应该做什么并不重要,但是对于那些在乎的人来说,它将是使用netlink套接字与内核进行通信的网络配置器)。

在方法configureBridge()(从第4种方法开始)中,我尝试创建一个对象并使用它(ip = IPRoute()... ip.release())并起作用了,但是ip除之外,我无法在任何其他函数中使用对象变量configureBridge()有人可以帮我吗?

class PyrouteTwo(Configurator):
    def __init__(self, inRollback=False):
        super(PyrouteTwo, self).__init__(ConfigApplier(), inRollback)
        self.runningConfig = RunningConfig()
        logging.debug("testmark.PyR2.init")

    def begin(self):
        if self.configApplier is None:
            self.configApplier = ConfigApplier()
        if self.runningConfig is None:
            self.runningConfig = RunningConfig()
        logging.debug("testmark.PyR2.begin")

    def commit(self):
        self.configApplier = None
        self.runningConfig.save()
        self.runningConfig = None
        logging.debug("testmark.PyR2.commit")

    def configureBridge(self, bridge, **opts):
        self.configApplier.addBridge(bridge)
        if bridge.port:
            bridge.port.configure(**opts)
            self.configApplier.addBridgePort(bridge)
        self.configApplier.setIfaceConfigAndUp(bridge)
        logging.debug("testmark.PyR2.confBridge..")

        # I am using the object here:
        ip = IPRoute(fork=True)
        dev = ip.link_lookup(ifname='em1')[0]
        logging.debug("pyroute2 link_lookup output: %d", dev)
        ip.release()


# there are some similar functions like configureVAN etc. in which I want 
# to use the object

class ConfigApplier(object):
    def _setIpConfig(self, iface):
        ipConfig = iface.ipConfig
        logging.debug("testmark.PyR2.ConfApplier.setIpConf.")
        if ipConfig.ipaddr:
            self.removeIpConfig(iface)
            ipwrapper.addrAdd(iface.name, ipConfig.ipaddr,
                              ipConfig.netmask)
            if ipConfig.gateway and ipConfig.defaultRoute:
                ipwrapper.routeAdd(['default', 'via', ipConfig.gateway])

    def removeIpConfig(self, iface):
        ipwrapper.addrFlush(iface.name)

    def setIfaceMtu(self, iface, mtu):
        ipwrapper.linkSet(iface, ['mtu', str(mtu)])

    def ifup(self, iface):
        ipwrapper.linkSet(iface.name, ['up'])
        if iface.ipConfig.bootproto == 'dhcp':
            dhclient = DhcpClient(iface.name)
            dhclient.start(iface.ipConfig.async)

    def ifdown(self, iface):
        ipwrapper.linkSet(iface.name, ['down'])
        dhclient = DhcpClient(iface.name)
        dhclient.shutdown()

    def setIfaceConfigAndUp(self, iface):
        if iface.ip:
            self._setIpConfig(iface)
        if iface.mtu:
            self.setIfaceMtu(iface.name, iface.mtu)
        self.ifup(iface)

    def addBridge(self, bridge):
        rc, _, err = execCmd([EXT_BRCTL, 'addbr', bridge.name])
        if rc != 0:
            raise ConfigNetworkError(ERR_FAILED_IFUP, err)

    def addBridgePort(self, bridge):
        rc, _, err = execCmd([EXT_BRCTL, 'addif', bridge.name,
                              bridge.port.name])
        if rc != 0:
            raise ConfigNetworkError(ERR_FAILED_IFUP, err)

    def removeBridge(self, bridge):
        rc, _, err = execCmd([EXT_BRCTL, 'delbr', bridge.name])
        if rc != 0:
            raise ConfigNetworkError(ERR_FAILED_IFDOWN, err)
        logging.debug("testmarkPyR2.ConfApplier.remBridge")

    # ... 

    def createLibvirtNetwork(self, network, bridged, iface, qosInbound=None,
                             qosOutbound=None):
        netXml = libvirtCfg.createNetworkDef(network, bridged, iface,
                                             qosInbound, qosOutbound)
        libvirtCfg.createNetwork(netXml)
        logging.debug("testmarkPyR2.ConfApplier.createLibvirtNetwork")

    def removeLibvirtNetwork(self, network):
        libvirtCfg.removeNetwork(network)
        logging.debug("testmarkPyR2.ConfApplier.remLibvirtNetwork")
Arovit

您可以通过以下方式将其声明为特定于对象的服装-

self.ip = value   # Now its a object specific variable

或在为它赋值之前使其成为可验证的类。

class PyrouteTwo(Configurator):
    ip = None    # Now its a class variable

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章