gpt4 book ai didi

python - 使用 python 'ipaddress' 以及 _methods 与直接值的目的

转载 作者:太空宇宙 更新时间:2023-11-04 02:01:44 26 4
gpt4 key购买 nike

我希望在这里得到一些澄清(Python 新手)。所以我试图调出一个大的 VLAN,然后根据某些标准将该 VLAN 分成几个较小的子网。

在查看所有类方法时,我看到一个名为 _prefixlen 的方法。看stackoverflow的其他帖子,好像一般_methods一般都是私有(private)模块方法,调用import的时候不会带进来。 Source here .但是,使用这种方法它确实允许我更改 prefixlen。

import ipaddress as ip
network1 = ip.ip_network(network_allocation)
network1._prefixlen = 10
print(network1.prefixlen)
>>> 10

这是一个正常的惯例,还是我只是被一个正常的惯例搞糊涂了,任何指导都会很有帮助。

最佳答案

在 Python 中没有什么是真正的“私有(private)”的;俗话说“有文化”。带有单个下划线前缀的东西是“准私有(private)”的,因为这是开发人员的说法,“你真的不需要碰这个。” (或者,如果您在应用程序代码中依赖它,它可能会在零通知的情况下发生变化。)

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 实例最好被视为不可变的。

一个不错的技巧是类构造函数 accept a tuple对于 address 参数,因此您可以从部分构建:

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

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

关于python - 使用 python 'ipaddress' 以及 _methods 与直接值的目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55550499/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com