0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

python私有变量和私有方法

python爬虫知识分享 来源:python爬虫知识分享 作者:python爬虫知识分享 2022-03-08 16:30 次阅读

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.foo
11
>>> demo._bar
22

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

但实际上,二者是有区别的。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.__baz
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: 'Demo' object has no attribute '__baz'

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

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

>>> demo._Demo__baz
33

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

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

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

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

4. 总结一下

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

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

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

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

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

审核编辑:符乾江

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4119

    浏览量

    61552
  • 代码
    +关注

    关注

    30

    文章

    4598

    浏览量

    67333
  • python
    +关注

    关注

    53

    文章

    4701

    浏览量

    83703
收藏 人收藏

    评论

    相关推荐

    海外青云私有云:企业的数字化转型得力助手

    在全球化日益加深的今天,海外企业对于云计算的需求也愈发迫切。青云(QingCloud)作为一家领先的云计算服务提供商,其私有云产品在海外市场上受到了广泛的关注和认可。那么,海外青云私有云究竟有何用处呢?本文将从多个角度为您科普。
    的头像 发表于 06-25 10:11 80次阅读

    绿联NAS DXP系列发布:内网穿透技术在私有云的应用分析

    对于NAS私有云来说,内外穿透会在不同网络环境(如内网和外网)之间实现数据访问和共享的能力,在这个背景下,内外穿透技术对于NAS私有云来说可能具有以下潜在应用
    的头像 发表于 05-24 12:06 185次阅读
    绿联NAS DXP系列发布:内网穿透技术在<b class='flag-5'>私有</b>云的应用分析

    什么是虚拟私有网VPN?VPN的常用技术有哪些?

    VPN定义(Vitual Private Network,虚拟私有网):是指依靠ISP或其他NSP在公用网络基础设施之上构建的专用的安全数据通信网络,只不过这个专线网络是逻辑上的而不是物理的,所以称为虚拟专用网。
    的头像 发表于 04-01 10:13 784次阅读
    什么是虚拟<b class='flag-5'>私有</b>网VPN?VPN的常用技术有哪些?

    请问可以私有部署吗

    有没有插件或者私有部署的服务
    发表于 02-01 16:00

    通过TC275 CPU0使用私有地下访问PSDR后出错了怎么解决?

    通过 TC275 CPU0 使用私有地下访问PSDR后出错了。再次 downloading,defale 还没有,有解决方法吗?
    发表于 01-19 08:07

    mec边缘计算与私有云的区别

    Mec边缘计算与私有云是目前云计算领域中两个热门的概念。尽管它们都是用来处理数据、存储和处理计算任务的技术,但在架构、功能以及应用场景等方面存在着显著的区别。 首先,我们来说一说私有云。私有云是一种
    的头像 发表于 12-27 15:31 586次阅读

    python环境变量的配置pip

    Python环境变量的配置和使用是每个Python开发者都需要了解和掌握的基本技能之一。在本文中,我们将详细介绍如何正确配置Python环境变量
    的头像 发表于 12-15 15:41 1342次阅读

    私有VLAN(cisco)和MUX VLAN(HUAWEI)

    私有vlan是一种机制,将特定VLAN划分成任意数量的不会相互重叠的二级VLAN(Secondary VLAN)。划分过程对于外部网络是不可见的,外部网络只能看到原始的VLAN,称为主VLAN(Primary VLAN)。
    的头像 发表于 12-10 10:20 727次阅读
    <b class='flag-5'>私有</b>VLAN(cisco)和MUX VLAN(HUAWEI)

    如何在嵌入式C编码中规范变量

    ◎ 不用或者少用全局变量 说明:单个文件内部可以使用static的全局变量,可以将其理解为类的私有成员变量。全局变量应该是模块的
    的头像 发表于 12-07 14:42 210次阅读

    python变量命名规则

    Python是一种高级编程语言,广泛应用于软件开发、数据分析和科学计算等领域。在Python中,变量是用来存储数据的容器,它们具有名称以及与之关联的值。然而,变量的命名并不是随意的,而
    的头像 发表于 11-23 15:44 847次阅读

    STM32WL私有LoRa网络设计原理以及演示介绍

    STM32WL私有LoRa网络设计原理以及演示介绍
    的头像 发表于 09-19 16:42 2149次阅读
    STM32WL<b class='flag-5'>私有</b>LoRa网络设计原理以及演示介绍

    私有云是什么?私有云是什么意思

    私有云是什么?私有云是什么意思?下面由我来为大家详细讲解,首先我们要了解私有云是什么?私有云是什么意思?,其次我们需要就是云计算? 私有云是
    的头像 发表于 08-02 15:31 2703次阅读

    152. 装备制造业•私有云研发平台概述 #硬声创作季

    私有
    充八万
    发布于 :2023年07月06日 03:42:17

    151. VMware私有云平台部署NX和TEAMCENTER实验 - 准备工作

    私有
    充八万
    发布于 :2023年07月06日 03:41:07

    150. VMware私有云平台部署NX和TEAMCENTER实验 #硬声创作季

    私有
    充八万
    发布于 :2023年07月06日 03:39:58