我希望在这里得到一些澄清(python的新手)。因此,我尝试调用一个较大的VLAN,然后根据一些条件将该VLAN分成几个较小的子网。
在查看所有类方法时,我看到了一个名为_prefixlen
的方法。查看stackoverflow中的其他文章,通常_method通常是私有模块方法,并且在调用import
时不会被带入。 Source here。但是,使用这种方法确实可以让我更改prefixlen。
import ipaddress as ip
network1 = ip.ip_network(network_allocation)
network1._prefixlen = 10
print(network1.prefixlen)
>>> 10
这是常规惯例还是只是对常规惯例感到困惑,所以任何指导都将真正有用。
答案 0 :(得分:2)
在Python中,没有什么是真正的“私有”;俗话说“这是文化的”。带有单个下划线的前缀是“准私有的”,因为这是开发人员的说法,“您真的不需要碰这个。” (或者,也许,如果您在应用程序代码中依赖于此,它可能会在零通知的情况下进行更改。)
问题pattern看起来像这样:
@property
def prefixlen(self):
return self._prefixlen
位置:
_prefixlen
是一个属性 prefixlen
是属性-基本上是不需要用()
调用的实例方法,从而简化了事情在这种情况下,这实际上使prefixlen
成为只读状态,但是如果您确实想要的话,基础属性_prefixlen
可以完全修改:
>>> import ipaddress
>>> nw = ipaddress.ip_network('192.0.2.0/24')
>>> nw.prefixlen
24
>>> nw.prefixlen = 32
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
如果您想修改前缀,则不妨创建一个新对象-添加@property.setter
到位就可以修改给定对象,从根本上改变您正在查看的内容,因此IPv4Network
和IPv6Network
实例最好被视为不可变的。
一个不错的技巧是address
参数的类构造函数accept a tuple,因此可以从以下部分进行构造:
>>> ipaddress.IPv4Network((nw.network_address, 32))
IPv4Network('192.0.2.0/32')
感谢@chepner在下面的评论中提供的最后一个技巧。