您的位置 首页 电子技术

python私有变量和私有方法

python私有变量和私有方法 1. 下划线妙用 在 Python 中,下划线可是非常推荐使用的符号: 变量名推荐使用下划线分隔的蛇形命名法 魔法方法、构造函数都需要使用双下划线 对于暂时用不到的变量值,可以赋值给单下划线 _ 进行占位 根据分类,我把下划线写法分成下面五种: 单前导下划线: _var 单末尾下划线: var_ 双前导下划线: __var 双前导和末尾下划线: __var__ 单下划线: _ 由于篇幅所限,本篇将只介绍跟标题(私有变量与私有方法)有关的用法,也\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

python私有变量和私有方法1. 下划线妙用

在 Python 中,下划线可是非常推荐使用的符号:

变量名推荐使用下划线分隔的蛇形命名法

魔法方法、构造函数都需要使用双下划线

对于暂时用不到的变量值,可以赋值给单下划线 _ 进行占位

根据分类,我把下划线写法分成下面五种:

单前导下划线:_var

单末尾下划线:var_

双前导下划线:__var

双前导和末尾下划线:__var__

单下划线:_

由于篇幅所限,本篇将只介绍跟标题(私有变量与私有方法)有关的用法,也就是访问控制。

上面五种写法中,涉及到访问控制的有:_var__var

2. 单前导下划线 _var

下划线前缀的含义是告知其他程序员:以单个下划线开头的变量或方法仅供内部使用。

请看下面这个例子

class Demo:   def __init__(self):       self.foo = 11       self._bar = 22

如果你实例化此类,然后分别访问 self.fooself._bar 会发生什么情况?

>>> demo = Demo()>>> demo.foo11>>> demo._bar22

结果是:外界都可以直接访问这两个属性。

但实际上,二者是有区别的。PEP 8 有提及,如果一个属性的有单前导下划线,则该属性应该仅供内部访问。

但这并不是强制性的,不然上面我们也不可能通过 self._bar 访问到 22,但做为一名 Python 程序员最好遵守这一共识。

3. 双前导下划线 __var

双下划线前缀会导致Python解释器重写属性名称,以避免子类中的命名冲突。

这也叫做名称修饰(name mangling) – 解释器更改变量的名称,以便在类被扩展的时候不容易产生冲突。

我知道这听起来很抽象。因此,我组合了一个小小的代码示例来予以说明:

class Demo:   def __init__(self):       self.foo = 11       self._bar = 22       self.__baz = 33

将其进行实例化,然后使用 dir() 函数查看这个对象的属性

>>> demo = Demo()>>> dir(demo)[\'_Demo__baz\', \'__class__\', \'__delattr__\', \'__dict__\', \'__dir__\', \'__doc__\', \'__eq__\', \'__format__\', \'__ge__\', \'__getattribute__\', \'__gt__\', \'__hash__\', \'__init__\', \'__init_subclass__\', \'__le__\', \'__lt__\', \'__module__\', \'__ne__\', \'__new__\', \'__reduce__\', \'__reduce_ex__\', \'__repr__\', \'__setattr__\', \'__sizeof__\', \'__str__\', \'__subclasshook__\', \'__weakref__\', \'_bar\', \'foo\']

不难发现,foo_bar 都很正常,可以使用 demo.属性名 进行访问。

__baz 明显和 foo_bar 不一样,尝试访问后却报了 AttributeError,属性不存在。

>>> demo.__bazTraceback (most recent call last):  File \"\", line 1, in AttributeError: \'Demo\' object has no attribute \'__baz\'

如果你仔细观察,你会看到此对象上有一个名为_Demo__baz的属性。这就是Python解释器所做的名称修饰。它这样做是为了防止变量在子类中被重写。

如果想访问,那得按照 dir 提示的写法去访问,在 __baz 前面加上 _类名

>>> demo._Demo__baz33

总结可得,使用双下划线开头的属性变量,就是一个私有变量。

这样的规则在属性上生效,在方法上也同样适用。

如果一个实例方法,以双下划线开头,那么这个方法就是一个私有的方法,不能由实例对象或者类直接调用。

必须得通过 实例._类名__方法名 来调用。

4. 总结一下

Python并没有真正的私有化支持,但可用下划线得到伪私有。

尽量避免定义以下划线开头的变量。

私有变量:以双下划线前导的变量,可以使用 实例._类名__变量名 进行访问

私有方法:以双下划线前导的方法,可以使用 实例._类名__方法名() 进行访问

私有变量和私有方法,虽然有办法访问,但是仍然不建议使用上面给出的方法直接访问,而应该用统一的接口(函数入口)来对私有变量进行查看、变量,对私有方法进行调用。审核编辑:符乾江

<!–

免责声明:文章内容不代表本站立场,本站不对其内容的真实性、完整性、准确性给予任何担保、暗示和承诺,仅供读者参考,文章版权归原作者所有。如本文内容影响到您的合法权益(内容、图片等),请及时联系本站,我们会及时删除处理。

作者: admin

为您推荐

智慧路灯照明系统的应用为智慧城市的发展建设添砖加瓦

智慧路灯照明系统的应用为智慧城市的发展建设添砖加瓦

智慧路灯照明系统的应用为智慧城市的发展建设添砖加瓦-夜间的路灯不仅照亮了黑暗的街道,而且照亮了回家的道路。从街上望去,闪烁的路灯发出暖光,指引着我们家的方向。城市里的路灯就像“守护者”,给长途旅行回来的游客带来了极大的安全感。 当今,路灯智能控制时代的到来,极大地促进了传统路灯的人工机械化运行。虽然对此感到兴奋,但我们不禁要问:随着路灯智能控制的早期到来,除了改善路灯的运行模式,还能带来什么? 为城市交通提供安全保障 城市公共照明系统中的智能路灯在每个路

晶振在五种不同行业中的应用说明

晶振在五种不同行业中的应用说明-晶振在五种不同行业的应用-由TST嘉硕代理KOYU光与电子

几种不同的物联网控制APP模式

本文就简单介绍当前几种物联网控制APP模式,让大家了解几种不同的技术路线。\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

苹果稳坐全球可穿戴设备数量首位,占据日本市场超7成份额

苹果稳坐全球可穿戴设备数量首位,占据日本市场超7成份额

苹果公司占据2021年日本第四季度可穿戴设备71.5%份额,占据全球可穿戴设备市场34.9%份额。\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

如何用GPUDirect存储器如何缓解CPU I / O瓶颈

除了使用 GPUs 而不是 CPU 加快计算的好处外,一旦整个数据处理管道转移到 GPU 执行,直接存储就起到了一个力倍增器的作用。这一点变得尤为重要,因为数据集大小不再适合系统内存,而且 GPUs 的数据 I / O 增长成为处理时间的瓶颈。当人工智能和数据科学继续重新定义可能的艺术时,启用直接路径可以减少甚至完全缓解这个瓶颈。\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部