我有一个包含两个类的模块。
我在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'
答案 0 :(得分:2)
您的ConfigApplier
班级没有属性self.ipr
。您的其他班级PyrouteTwo
有self.ipr
但不是ConfigApplier
。
我不确定代码的意图是什么,但您需要从PyrouteTwo
类继承为父代。您目前正在尝试使用super
来执行此操作,但它不会以这种方式工作。您也可以将这两个类合并为一个。
你应该尝试从PyrouteTwo
继承,但是把它放在你的初始类语句中:
class ConfigApplier(PyrouteTwo, object):
#...
但是,您可以将ConfigApplier
中的唯一功能添加到PyrouteTwo
课程中。因此,只需剪切ConfigApplier
函数并将其放入PyrouteTwo
。
如果您有任何问题,请在下面提出。