python 类的使用(7)之类的私有属性和方法 (类中以单下划线或双下划线开头的变量名或函数名)

Python类中的 私有变量和私有方法 python类中的私有变量和私有方法 下划线 name mangling 技术 阅读详情

在python中有时候会发现别人写的代码中会有一些函数或者变量是以下划线开头的,这些情况又主要出现在类中,其中既有单下划线,也有双下划线,这种以下划线开头的函数或者变量实际上就是代表“私有”的意思,在python中私有变量不需要额外的像其它某些语言中还需要使用private关键词,在python中使用下划线开始命名类中的函数或者变量即可表示私有。那么单下划线和双下划线开头的具体意义以及区别分别是什么呢?若有兴趣请看本文细细为您分析!

附上类使用专栏的其它文章的链接:


以单下划线开头的函数或变量(类中)

以单下划线开头的函数或者变量实际上是伪私有,在类中定义的加单下划线的函数或者属性都是可以被类外部所访问到的。以单下划线开头的函数或变量的意义对我们来说就是虽说其能够被访问,但是最好不要访问(这种伪私有属性或方法的含义就是告诉我们使用这个类的人最好不要直接调用它)。

举个简单的例子:

class Animal:
    _type = 'cute'
    # 定义了一个以单下划线开头的类属性
    def __init__(self):
        self._age = 3
        # 这里也有一个以单下划线开头的类属性
        self.name = 'xiaobai'
    
    def _show_info(self):
    # 定义了一个以单下划线开头的函数
        return self.name, self._age

a = Animal()
print(a._show_info(),a._type, a._age)
# 这里直接调用函数和直接调用两个属性
# 结果:('xiaobai', 3) cute 3
# 可以看到是像普通的属性或方法一样调用就行了

除了上面正常调用外,类的继承时父类的以单下划线开头的属性以及方法也都会被继承。在某些博客中看到说这种命名的方式在使用from module import 类名时会出错,但是我试了没什么问题,但也不知道是不是我有什么误解。

以双下划线开头的函数或变量(类中)

在一个类中,不乏有以双下划线包围的函数,这些函数之前我已经介绍过了,它们就是类的魔法方法,而单纯以双下划线开头的函数或变量代表的是python类中真正的私有方法或属性,这些方法或者属性在类的外部是不能被访问到的。也就是不能被以这种类名.__变量名或类名__函数名的形式被访问到,同时类的继承中,这些私有属性及私有方法也不能被继承,但在类的内部这些私有属性和方法是可以被访问到的,因此可以通过间接的方法来设置、访问这些私有变量或函数。

先看一个简单的例子:

class City:
    def __init__(self):
        self.__name = 'Beijing'
        # 这里设置一个私有变量
        self.area = 16410.54
   
    def show_area(self):
        print(self.area)
            
    def __show_area(self):
        print(self.area)
        
a = City() 
a.show_area()   # 结果:16410.54
a.__show_area() # 报错:'City' object has no attribute '__show_area'
print(a.__name) # 报错:'City' object has no attribute '__name'
# 根据上面的结果,确实是能看出以双下划线开头的属性和方法确实是真正的私有变量



# ok,接下来举个在类内部使用这些私有属性或方法的例子:
class City:
    def __init__(self):
        self.__name = 'Beijing'
        # 这里设置一个私有变量
        self.area = 16410.54
    
    def __show_area(self):
        return self.area
    
    def show_name_and_area(self):
        print(self.__name, self.__show_area)
        
    def change_name(self, new_name):
        self.__name = new_name
      
a = City() 
a.show_name_and_area()  
# 运行结果:Beijing 16410.54
a.change_name('BJ')
# 这里修改内部的私有变量
a.show_name_and_area()  
# 运行结果:BJ 16410.54
# 私有变量被成功修改,可以看到在类的内部调用还是很有用的



# 接下来看一下在类继承时的情况:
class City:
    def __init__(self):
        self.__name = 'Beijing'
        # 这里设置一个私有变量
        self.area = 16410.54
    
    def __show_area(self):
        print(self.area)   
          
class A:
    pass

a = A()
a.__show_area()  # 报错:'A' object has no attribute '__show_area'
print(a.area)    # 结果:16410.54
print(a.__name)  # 报错:'A' object has no attribute '__name'
# 可以根据上述结果证明类的继承时私有方法和属性是不会被继承的,
# 这也使继承时不易发生变量名或函数名的冲突

当然并不是说一定不能访问到私有变量,python中是使用name mangling技术处理类中函数或变量名的,即__name替换成 _class__name,在类外部这样调用就行了,如下:

# 接上个例子
a = City()
a._City__show_area()

当然这种使用方式是不推荐的,毕竟被设置为私有的变量或函数肯定是有原因的,因此正常情况下不要使用这种方式去调用。

不在类中的下划线在函数名或变量名两侧的情况

这种情况实际上较少出现,但是也简单说一下吧,其实它们就是普通的全局变量或者函数,可以在任意地方被调用,我尝试了一下在函数名或变量名的两侧加好几个下划线都没问题,都可以正常调用的,当然平常我们不会这样用(没什么意义,看起来也很乱)。但是有时候为了与python中的保留字不冲突,可能会加下划线来区分,如class_可以与class关键字区分开。

叮

参考:python 私有属性和方法
参考:python变量前的单下划线(私有变量)和双下划线()

Python的命名规范 一、python变量名命名的硬性规则 1.1. 变量名大小写敏感 1.2. python的变量名字中可以包含英文、下划线、数字,但是不能以数字开头。 二、不同风格命名的变量代表不同的类型 2.1 2.2.模块(module)命名风格 2.3 ,正确的模块名 2.4不推荐的模块名 三,类(class)的命名 3.1类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头 3.2函数(function)的命名 四,变量(variable)的命名 4.1,变量名尽量小写, 如有多个单词,用 阅读详情

相关推荐

实战复盘:如何用Frida脚本绕过某书APP的libmsaoaidsec.so检测(附完整Hook代码)

本文深入探讨了如何利用Frida脚本绕过某书APP通过libmsaoaidsec.so实现的反Frida检测机制。通过分析动态链接过程中的关键节点和检测模式,提供了两种实战验证的绕过方案:动态Hook关键链接器函数和静态Patch SO文件。文章还分享了进阶对抗策略和调试技巧,帮助安全研究人员有效应对现代移动安全防护挑战。

weixin_42706667的博客 218

Python笔记 · 私有方法、私有属性 & 单下划线、双下划线

首先,不同于其他编程语言,Python中不存在真正意义上的“私有方法/属性”,Python中所胃的“私有方法”要么基于约定,要么基于编译期的改写(Name Mangling)。与私有方法、私有属性密切相关的是单下划线、双下划线。

Laurence的技术博客 1763

手把手教你用STM32的ADC读取PT100模块,实现高精度温度采集(附完整代码)

本文详细介绍了如何利用STM32的ADC模块读取PT100温度传感器信号,实现高精度温度采集系统。从硬件选型、ADC配置校准到温度计算算法和软件滤波技术,提供完整的实现方案和优化技巧,帮助工程师快速构建稳定可靠的温度监测系统。

weixin_29185199的博客 345

python 私有、保护、公共的属性/方法调用

python 私有、保护、公共的属性/方法调用

baidu_38860188的博客 1800

VS(QT)调用Matlab函数的方法

调试–>窗口–>异常设置–>Win32 Exceptions全部不要勾选。选择Microsoft Visual C++ 2017。将生成的.h和.lib分别放置在对应的文件夹。输入mex -setup C++输入deploytool选择。选择Realse x64。

woshigaowei5146的博客 591

Ubuntu20.04下Pycharm的快速安装与配置指南

本文提供了一份详细的Ubuntu 20.04系统下PyCharm社区版的安装与配置指南。文章重点介绍了通过手动下载.tar.gz压缩包进行安装的灵活方法,并涵盖了系统准备、依赖安装、首次运行、创建快捷方式以及解释器配置等关键步骤,帮助Python开发者快速搭建高效、可控的本地开发环境。

weixin_28831341的博客 379

Python类中的私有属性和私有方法

Python类中的私有属性和私有方法 Python是面向对象的语言,在Python里一切皆对象,所以大部分情况下,我们都是通过类的方式来编程。 但是Python中的属性和方法在类的外部默认是可以访问的,而有些属性和方法我们只允许在类的内部使用,不允许在类的外部使用。这种情况下,可以使用类的私有属性和私有方法。 一、私有属性 Python中通过一对前缀下划线“__”的属性名来定义私有属性。 ...

weixin_43790276的博客 5450

YOLO11实战:手把手教你优化钢材表面缺陷识别模型(基于NEU-DET数据集)

本文详细介绍了如何使用YOLO11优化钢材表面缺陷识别模型,基于NEU-DET数据集进行实战训练。从数据增强、模型架构优化到训练过程控制,全面解析提升钢材缺陷检测性能的关键技术,特别针对裂纹、划痕等典型缺陷提出针对性解决方案。

weixin_29081163的博客 379

python中变量前面加单下划线和双下划线的区别&python的私有属性

一、在py文件中 变量名字前面加单下划线和双下划线都是对变量的保护,一种约定,用来指定变量私有。程序员用来指定私有变量的一种方式.不能用from module import * 导入,其他方面和公有一样访问;可以使用import方式导入。在py文件内可以正常使用。 num = 1 _num = 10 __num = 100 if __name__ == '__main__': pr...

qq_43439853的博客 3122

DSI3协议介绍

分布式系统接口(DSI)是一种通用且功能强大的总线协议,旨在将多个遥感器和执行器设备互连到中央控制模块。该网络的主要目标应用是汽车安全系统。这种应用的一些特点是需要低成本、高鲁棒性、中速互连,仅限于两根导线。此外,它必须具有故障安全性、确定性和良好的EMC特性。即使具有所有级别的智能和可编程性的设备都可以连接到网络,远程设备也必须能够通过简单的状态机实现。由于模块尺寸非常重要,因此中央模块和远程单元中的最小组件至关重要。

汽车电子软件领域知识分享 1万+

05GATK流程和找变异

05GATK流程和找变异 GATK 集合了一套功能全面的高通量测序数据基因组分析工具包,算是业界的权威,更新的速度非常快。需要注意的是,不同版本的 GATK 在工具应用上会有些许不同。这里我们使用是最新版本 GATK 4.1.4.1(截止2019年12月31日)。 数据准备 前面我们提到了,走GATK流程需要到官网下载很多数据库文件,比如下面这些: dbsnp_146.hg38.vcf.gz dbsnp_146.hg38.vcf.gz.tbi Mills_and_1000G_gold_standard.

qq_23435961的博客 1660

python类私有属性(python私有属性)私有属性是双下划线__开头(名称改写name mangling),单下划线_开头只是约定,标明属性是保护的(保护属性)Python__Python __

的属性:这是一种约定,用来指示该属性或方法主要用于内部使用,不是公开的API的一部分,不应从类外部直接访问。因此,可以说它们是“非公开的”或“受保护的”属性,而非严格意义上的“私有”。Python 中的名称改写或 “name mangling” 主要用途是在类定义中隐藏内部细节,防止属性在子类中被无意覆盖,以及减少从类外部直接访问私有属性的可能性。)开头的属性是一种约定,用来指示属性是保护的,即这个属性应该只在类及其子类中使用,不应该在类的外部直接访问,但是这只是一个约定,并不是Python强制的规则。

Dontla的博客 1098

高通8155源码下载与Android源码编译

一.下载代码 高通下载源码位置: Qualcomm CreatePoint 注册账号,然后登入 可以先选择edit -> infotainment -> sa8155 -> favorites, 点击View TOC就可以过滤出sa8155所有的信息目录.如下图 拉取代码链接在ChipCode中,点击进去可以看到所有的基线版本,选择你需要下载的版本点进去,如sa8155p-la-1-0_ap_standard_oem,把高通专有代码和开源代码都下载到本机. 1..

Johnny2004的专栏 7675

[转]以下划线开头的变量名

C++; 系统头文件里将宏名、变量名、内部函数名用 _ 开头就是为了避免与用户用的名字冲突。因为当你#i nclude 系统头文件时,这些文件里的名字都有了定义,如果与你用的名字冲突,就可能引起各种奇怪现象。换句话说:我们写程序时一定不要用 _ 开头的名字,以免与系统头文件的名字冲突,产生奇怪的问题(很难debug、弄清楚,当心)。 Python: 核心风格:避免用...

weixin_34124939的博客 1840

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Python伪私有属性总结

前言:在前面的博文里,我介绍了Python中的面向对象,详情见:深入浅出Python——Python高级语法之文件操作,本文将主要讲解with open() as读写文件的优点与作用。

路虽远,行则必至! 1241

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

python中的单下划线和双下划线_python 类中的单下划线和双下划线

Python中没有访问控制的关键字,例如private、protected等等。但是,在Python编码中,有一些约定来进行访问控制。1、单下划线"_"在Python中,通过单下划线"“来实现模块级别的私有化,变量除外。一般约定以单下划线”"开头的函数为模块私有的,也就是说"from moduleName import * “将不会引入以单下划线”"开头的函数。现在有一个模块 example_ex...

weixin_39890289的博客 786

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

系统学习Python——下划线的作用与意义:单下划线与双下划线

介绍Python中单下划线和双下划线的使用。

冯·诺依曼 1万+

python 类的使用(5)之类装饰器(类的装饰器和类作为装饰器)

在Python中,类可以作为装饰器,同时也能被函数装饰器所装饰。本文简要介绍了类作为装饰器和函数装饰器装饰类的使用方式,有兴趣的不要错过啊!

keepaware的博客 2万+

python变量的命名和使用

python变量的命名和使用

听海边涛声 1362

Python:单下划线 & 双下划线

- **前面单下划线** : _var 变量所在模块/类以外的地方也能访问该变量,但最好不要 - **前面双下划线** : __privateVar 变量所在模块/类以外的地方不能访问该变量,这是私有变量 - **前后双下划线** : 如__name__和__init__ Python内置特殊变量,哪儿都可以访问

weixin_42046845的博客 781

【C++】关于以下划线开头的变量名

系统头文件里将宏名、变量名、内部函数名用"_"开头就是为了避免与用户用的名字冲突。因为当你#include 系统头文件时,这些文件里的名字都有了定义,如果与你用的名字冲突,就可能引起各种奇怪现象。换句话说:我们写程序时一定不要用"_"开头的名字,以免与系统头文件的名字冲突,产生奇怪的问题(很难debug弄清楚,当心)。 Python: 核心风格:避免用下划线作为变量名的开始。因为下划线

ShellCodeX 2万+

python类私有函数_知识点 - python 类的私有/保护 属性和方法

类的私有属性:__private_attrs:两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。类的方法:在类地内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数类的私有方法 :__private_method:两个下划线开头,声明该方法为私有方法,不能在类地...

weixin_39723678的博客 705

Python魔术:单下划线与双下划线的秘密

在介绍单下划线和双下划线之前,我们先来了解一下Python的命名规则。变量名、函数名和模块名应该使用小写字母和下划线的组合,如。类名应该使用驼峰命名法,即首字母大写,如MyClass。私有变量和方法的命名应该以单下划线开头,如。魔术方法和特殊方法的命名应该以双下划线开头和结尾,如__init__。

博客 445

python中的符号下划线_详解Python中下划线的使用方法

编程派微信号:codingpy这篇文章讨论Python中下划线_的使用。跟Python中很多用法类似,下划线 _ 的不同用法绝大部分(不全是)都是一种惯例约定。单个下划线(_)主要有三种情况:1. 解释器中_符号是指交互解释器中最后一次执行语句的返回结果。这种用法最初出现在CPython解释器中,其他解释器后来也都跟进了。2. 作为名称使用这个跟上面有点类似。_用作被丢弃内容的名称。按照惯例,这样...

weixin_35914724的博客 1152

【python】详解类class的访问控制:单下划线_与双下划线__(四)

Python中没有访问控制的关键字,例如private、protected等等。但是,在Python编码中,有一些约定来进行访问控制。 1、单下划线”_” 在Python中,通过单下划线”“来实现模块级别的私有化,变量除外。一般约定以单下划线”“开头的函数为模块私有的,也就是说”from moduleName import * “将不会引入以单下划线”_”开头的函数。 现在有一个模块

brucewong0516的博客 2万+

编程语言中双下划线的用法(待完善)

文章目录参考来源链接 参考来源链接

Be busy living or busy dying 4064
上一篇: python函数中的几种参数详解(必需参数、默认参数、可变参数、关键字参数、命名关键字参数)
下一篇: 编译型语言和解释型语言的区别以及两者分别的编译过程,看这篇文章就轻松搞懂咯!
你大佬来啦
博客等级 码龄7年 322粉丝 62原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值