使用python'ipaddress'和_methods与直接值的用途

时间:2019-04-06 15:18:14

标签: python python-3.x

我希望在这里得到一些澄清(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

这是常规惯例还是只是对常规惯例感到困惑,所以任何指导都将真正有用。

1 个答案:

答案 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到位就可以修改给定对象,从根本上改变您正在查看的内容,因此IPv4NetworkIPv6Network实例最好被视为不可变的。

一个不错的技巧是address参数的类构造函数accept a tuple,因此可以从以下部分进行构造:

>>> ipaddress.IPv4Network((nw.network_address, 32))
IPv4Network('192.0.2.0/32')

感谢@chepner在下面的评论中提供的最后一个技巧。