python中类的定义和使用_在Python中定义和使用类

博主正在学习Python,并遇到了类和对象的使用问题。他们尝试创建一个表示路由器的类,该类有可变数量的接口,每个接口可以有0到16个IP地址。在实现过程中,IP地址被错误地应用到了路由器类而不是接口上。博主展示了期望的行为和实际行为的对比,并尝试了不同的类结构来解决问题。他们询问关于如何正确构建和初始化这些对象的建议,特别是关于IP地址的分配和接口的动态创建。
摘要由CSDN通过智能技术生成

我正在学习Python,我有一些代码没有完成我认为它应该做的事情。我使用的是v3.4.3。最有可能的问题是:class Router:

'''A representation of a router'''

name = ''

ifc = []

class Interface:

ifName = ''

addr = []

helpers = ''

def __init__(self,routername,num):

self.ifc = []

self.name = routername

for i in range(num):

self.ifc.append(Router.Interface())

我的意图是创建一个具有可变数量接口的路由器对象。当我试图通过创建路由器时,这个号码是已知的

^{pr2}$

它创建了一个路由器d,name='r0',有两个接口。这部分很好用。

接下来我要做的是路由器对象上的各个接口。

一个接口可以有不同数量的IP地址分配给它,从0开始,我认为上限可能是16,但这并不重要。我的大多数接口都会有1到6个IP地址分配给它,当我创建路由器对象时,我不知道确切的数字,这个数字也会随着时间的推移而改变,实际的IP地址也会改变。

我写了一些代码来演示正在发生的事情和我期望发生的事情。每次我调用prnt函数时,我希望它为一个路由器上的一个接口打印出最多两个IP:la:

R0的期望输出,接口0。其他人也应该类似。Router: 0 Interface: 0 Name: Vlan100

0 ('1.1.1.0', '1.1.1.1', '255.255.255.0', 'secondary')

Router: 0 Interface: 0 Name: Vlan100

1 ('2.2.2.0', '2.2.2.1', '255.255.255.0', '')

实际发生的情况是,特定路由器接口的IP数据并没有应用于接口,而是应用于路由器类。

代码:def prnt(rtr, ifnum,label):

'''debug routine for showing results'''

print('\n',label,len(d), len(d[rtr].ifc),len(d[rtr].ifc[ifnum].addr))

for j in range(len(d[rtr].ifc[ifnum].addr)):

print('Router: ',rtr,'Interface: ',ifnum,'Name: ',d[rtr].ifc[ifnum].ifName,'\n\t\t',j,d[rtr].ifc[ifnum].addr[j])

print('\n')

return

#Define 8 IP networks.

net1 = ('1.1.1.0', '1.1.1.1', '255.255.255.0', 'secondary')

net2 = ('2.2.2.0', '2.2.2.1', '255.255.255.0', '')

net3 = ('3.3.3.0', '3.3.3.1', '255.255.255.0', 'secondary')

net4 = ('4.4.4.0', '4.4.4.1', '255.255.255.0', '')

net5 = ('5.5.5.0', '5.5.5.1', '255.255.255.0', 'secondary')

net6 = ('6.6.6.0', '6.6.6.1', '255.255.255.0', '')

net7 = ('7.7.7.0', '7.7.7.1', '255.255.255.0', 'secondary')

net8 = ('8.8.8.0', '8.8.8.1', '255.255.255.0', '')

# create d, a blank list

d=[]

print('Define list d. Length of d:',len(d))

#make d an object r0 of the Router class. Router has two interfaces.

d.append(Router('r0',2))

print ('Append r0. Length of d:',len(d),'Interface count:',len(d[0].ifc))

#make d an object r1 of the Router class. Router has two interfaces.

d.append(Router('r1',2))

print ('Append r1. Length of d:',len(d),'Interface count:','r0:',len(d[0].ifc),'r1:',len(d[1].ifc))

#Name four interfaces, two on each router

d[0].ifc[0].ifName='Vlan100'

d[0].ifc[1].ifName='Vlan101'

d[1].ifc[0].ifName='Vlan200'

d[1].ifc[1].ifName='Vlan201'

print ('Name Interfaces. Length of d:',len(d),'Interface count:',

'r0:',len(d[0].ifc),'r1:',len(d[1].ifc))

# show the router interface information. At this point, nothing should print, as

# none of the interfaces have IP addresses attched to them

prnt(0,0,'I expect nothing #1')

prnt(0,1,'I expect nothing #2')

prnt(1,0,'I expect nothing #3')

prnt(1,1,'I expect nothing #4')

#

#The intent is to populate two IP addresses onto each of the four interfaces

#Starting with R0-0, I'll add one IP at a time and print each of the four interfaces

d[0].ifc[0].addr.append(net1)

prnt(0,0,'I expect 1.1 only on r0 ifc 0')

prnt(0,1,'I expect nothing #5')

prnt(1,0,'I expect nothing #6')

prnt(1,1,'I expect nothing #7')

#

d[0].ifc[0].addr.append(net2)

prnt(0,0,'I expect 1.1 and 2.2 on r0 ifc 0')

prnt(0,1,'I expect nothing #8')

prnt(1,0,'I expect nothing #9')

prnt(1,1,'I expect nothing #10')

#

d[0].ifc[1].addr.append(net3)

prnt(0,0,'I expect 1.1 and 2.2 on r0 ifc 0')

prnt(0,1,'I expect 3.3 on r0 ifc 1')

prnt(1,0,'I expect nothing #11')

prnt(1,1,'I expect nothing #12')

#

d[0].ifc[1].addr.append(net4)

prnt(0,0,'I expect 1.1 and 2.2 on r0 ifc 0')

prnt(0,1,'I expect 3.3 and 4.4 on r0 ifc 1')

prnt(1,0,'I expect nothing #11')

prnt(1,1,'I expect nothing #12')

#

d[1].ifc[0].addr.append(net5)

prnt(0,0,'I expect 1.1/2.2 on r0 ifc 0')

prnt(0,1,'I expect 3.3/4.4 on r0 ifc 1')

prnt(1,0,'I expect 5.5 only on r1 ifc 0')

prnt(1,1,'I expect nothing #13')

#

d[1].ifc[0].addr.append(net6)

prnt(0,0,'I expect 1.1/2.2 on r0 ifc 0')

prnt(0,1,'I expect 3.3/4.4 on r0 ifc 1')

prnt(1,0,'I expect 5.5/6.6 on r1 ifc 0')

prnt(1,1,'I expect nothing #14')

#

d[1].ifc[1].addr.append(net7)

prnt(0,0,'I expect 1.1/2.2 on r0 ifc 0')

prnt(0,1,'I expect 3.3/4.4 on r0 ifc 1')

prnt(1,0,'I expect 5.5/6.6 on r1 ifc 0')

prnt(1,1,'I expect 7.7 only on r1 ifc 1')

#

d[1].ifc[1].addr.append(net8)

prnt(0,0,'I expect 1.1/2.2 on r0 ifc 0')

prnt(0,1,'I expect 3.3/4.4 on r0 ifc 1')

prnt(1,0,'I expect 5.5/6.6 on r1 ifc 0')

prnt(1,1,'I expect 7.7/8.8 on r1 ifc 1')

有人告诉我,在类中嵌入类是个问题,所以我尝试另一种方法,大致如下:class Address:

'''representation of the data required for a valid interface

type is either '' (primary) or 'secondary' '''

sub=''

gw=''

mask=''

typ=''

class Interface:

'''representation of an interface'''

ifName = ''

addr = []

helpers=''

def __init__(self,name,ipnum):

self.ifName = name

self.addr = [Address(i) for i in range(ipnum)]

class Router:

''' representation of a router'''

name = ''

ifc = []

def __init__(self,name,ifnum):

self.name = name

self.ifc =[Interface(i) for i in range(ifnum)]

这是朝着正确的方向迈出的一步吗?我对创建各种对象的顺序(和步骤)有点犹豫不决。对于给定的路由器,我可以先创建路由器对象,然后创建接口,再创建地址,还是需要按相反的顺序创建?我有大量的IP空间分布在100多个路由器上。请原谅我对OOP术语不够精确。我是老派,学新东西。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值