Object 高效内省Python对象IP地址实例所有权

Object 高效内省Python对象IP地址实例所有权,object,python,introspection,Object,Python,Introspection,在下面的代码中,我试图找到一种方法,从L3Address()类中删除self.owner。。。我想知道谁拥有给定Vlan或接口上的IP地址,而不必显式地调用它 有没有更好的方法来获取IPv4地址的所有者(可能是通过内省) 导入ipaddr 类SomethingOwned(对象): 定义初始化(self,owner=None): self.\u owner=所有者 #Build self.owner(拥有子类对象的对象实例) self.\u创建\u所有者() 定义创建所有者(自身): """ 创建

在下面的代码中,我试图找到一种方法,从
L3Address()
类中删除
self.owner
。。。我想知道谁拥有给定Vlan或接口上的IP地址,而不必显式地调用它

有没有更好的方法来获取IPv4地址的所有者(可能是通过内省)

导入ipaddr
类SomethingOwned(对象):
定义初始化(self,owner=None):
self.\u owner=所有者
#Build self.owner(拥有子类对象的对象实例)
self.\u创建\u所有者()
定义创建所有者(自身):
"""
创建self.owner并确保正确调用了子类
"""
如果不是(自身所有者为无):
self.owner=self.\u owner
其他:
raise VALUERROR,“%s()必须使用“所有者”参数调用,该参数不能为None”%self.\uuuuuu class.\uuuuu.\uuu name__
L3类地址(某些所有者):
"""
具有所属对象的第三层IP PDU地址
"""
def uuu init uuuu(self,version=None,owner=None,addr=None,masklen=None):
#调用SomethingOwned.\uuuu init\uuuu(owner=owner)以添加owner属性
超级(L3Address,self)。\uuuuu init\uuuuuuuu(所有者=所有者)
self.\u addr=addr
自我。_masklen=masklen
self.\u version=版本
#建立自我
self.\u创建\u ip\u对象()
self.addr=self.\u obj.ip
self.netmask=self.\u obj.netmask
self.masklen=self.\u obj.prefixlen
定义报告(自我):
返回“”%(self.\u版本,self.addr,self.masklen)
定义创建ip对象(自身):
"""
创建self.\u obj并确保使用正确的版本调用子类
"""
如果self.\u version==4:
如果(self.\u masklen为无):
self.\u obj=ipaddr.ipv4网络(self.\u addr)
其他:
self.\u obj=ipaddr.ipv4网络(“%s/%s”%(self.\u addr,self.\u masklen))
elif版本==6:
如果(self.\u masklen为无):
self.\u obj=ipaddr.ipv6网络(self.\u addr)
其他:
self.\u obj=ipaddr.ipv6网络(“%s/%s”%(self.\u addr,self.\u masklen))
其他:
raise VALUE ERROR,“版本必须为4或6”
IPv4类(L3地址):
定义初始(自我,**kwargs):
##初始化IPv4网络对象实例
#调用L3协议。初始化(版本=4**kwargs)
超级(IPv4,自我)。\uuuuu初始化(版本=4,**kwargs)
类别IPv6(L3地址):
定义初始(自我,**kwargs):
##初始化IPv6网络对象实例
#调用L3协议。初始化(版本=6**kwargs)
超级(IPv4,自我)。\uuuuu初始化(版本=6,**kwargs)
类Vlan(对象):
def _;初始化(self,name=None,id=None,ipv4=None):
self.id=id
self.name=名称
如果不是(ipv4为无):
###注意:我试图在这里消除对所有者arg的需要
self.ipv4=ipv4(所有者=self,地址=ipv4)
定义报告(自我):
返回“Vlan%s(名称:%s)”%(self.id,self.name)
类接口(对象):
def u uu init uuuuu(self,id=None,ipv4=None):
self.id=id
self.ipv4=无
如果不是(ipv4为无):
###注意:我试图在这里消除对所有者arg的需要
self.ipv4=ipv4(所有者=self,地址=ipv4)
定义报告(自我):
返回“接口%s”%self.id
如果“名称”=“\uuuuuuuu主要”:
def查找_所有者(ip_实例):
打印“'%s'的所有者是'%s'”(ip_实例,ip_实例.所有者)
查找所有者(接口(id='ge-0/0/0',ipv4='1.1.1'.ipv4)
查找所有者(Vlan(id='25',name='accounting',ipv4='1.1.1.2/25')。ipv4)
执行结果

[mpenning@hotcoffee ~]$ python cisco.py 
Owner of <IPv4 1.1.1.1/32> is 'Interface ge-0/0/0'
Owner of <IPv4 1.1.1.2/25> is 'Vlan 25 (name: accounting)'
[mpenning@hotcoffee ~]$
[mpenning@hotcoffee~]$python cisco.py
is“接口ge-0/0/0”的所有者
is“Vlan 25(名称:记帐)”的所有者
[mpenning@hotcoffee ~]$

无法从
L3Protocol
中删除
owner
字段,而只是在运行时神奇地确定它。你本质上要问的是“什么对象引用了这个?”。在一般情况下,这当然没有意义,因为可能有任意数量的对象包含对
L3Protocol
实例的引用(每个对象甚至可以包含对
L3Protocol
实例的任意数量的引用)

因此,要么你必须以某种方式记录每个
L3Protocol
的所有者,要么你只需要在有更多信息的上下文中询问
L3Protocol
的所有者
owner
理论上可以是一个函数,它接受一个
L3Protocol
和一组潜在所有者,并返回拥有
L3Protocol
的所有者(或
None
)。如果您有一个记录所有
接口
s和
Vlan
s的对象,那么将其作为该对象上的一种方法是可行的


但看起来你这样做几乎是我能想到的最直接的方式,只要你确保双向链接(所有者->所有者和所有者->所有者)保持一致,如果它们发生变化。

你目前使用所有者的方法可能是最干净的解决方案

也就是说,如果您需要找出谁拥有IP地址,那么可能会有所帮助

[mpenning@hotcoffee ~]$ python cisco.py 
Owner of <IPv4 1.1.1.1/32> is 'Interface ge-0/0/0'
Owner of <IPv4 1.1.1.2/25> is 'Vlan 25 (name: accounting)'
[mpenning@hotcoffee ~]$