如何访问每个模块类中的对象?蟒蛇

时间:2014-03-31 13:27:21

标签: python object python-2.7 module

我有一个包含两个类的模块。 我在ip = IPDB(fork=True)的第一个班级PyrouteTwo中创建了对象__init__。 从第1类中的任何方法访问此对象都没有问题。 问题是我无法在模块ConfigApplier的第二类中使用此对象。

这是代码的一个片段。它将是使用netlink socket与linux内核通信的网络配置器。我创建的对象是netlink通信套接字,我只能在应用程序中创建一个,所以我不能在第二个类中创建另一个。

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

    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..")
# !!! Here I can use the object with no problem.
        dev = self.ipr.link_lookup(ifname='em1')[0]
        logging.debug("pyroute2 link_lookup output: %d", dev)

...
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])
# !!! But here I can't use it !!!
        dev = self.ipr.link_lookup(ifname='em1')[0]
        logging.debug("pyroute2 _setIpConfig output: %d", dev)

错误输出在这里:

Traceback (most recent call last):
  File "/usr/share/vdsm/supervdsmServer", line 98, in wrapper
    res = func(*args, **kwargs)
  File "/usr/share/vdsm/supervdsmServer", line 190, in addNetwork
    return configNetwork.addNetwork(bridge, **options)
  File "/usr/share/vdsm/configNetwork.py", line 190, in wrapped
    return func(*args, **kwargs)
  File "/usr/share/vdsm/configNetwork.py", line 290, in addNetwork
    netEnt.configure(**options)
  File "/usr/share/vdsm/netmodels.py", line 159, in configure
    self.configurator.configureBridge(self, **opts)
  File "/usr/share/vdsm/netconf/pyroute_two.py", line 73, in configureBridge
    self.configApplier.setIfaceConfigAndUp(bridge)
  File "/usr/share/vdsm/netconf/pyroute_two.py", line 257, in setIfaceConfigAndUp
    self._setIpConfig(iface)
  File "/usr/share/vdsm/netconf/pyroute_two.py", line 227, in _setIpConfig
    dev = self.ipr.link_lookup(ifname='em1')[0]
AttributeError: 'ConfigApplier' object has no attribute 'ipr'

1 个答案:

答案 0 :(得分:2)

您的ConfigApplier班级没有属性self.ipr。您的其他班级PyrouteTwoself.ipr但不是ConfigApplier

我不确定代码的意图是什么,但您需要从PyrouteTwo类继承为父代。您目前正在尝试使用super来执行此操作,但它不会以这种方式工作。您也可以将这两个类合并为一个。

你应该尝试从PyrouteTwo继承,但是把它放在你的初始类语句中:

class ConfigApplier(PyrouteTwo, object):
    #...

但是,您可以将ConfigApplier中的唯一功能添加到PyrouteTwo课程中。因此,只需剪切ConfigApplier函数并将其放入PyrouteTwo

如果您有任何问题,请在下面提出。