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,变量名尽量小写, 如有多个单词,用 阅读详情

相关推荐

unity游戏开发日志(一)将mmd模型导入unity,并解决材质丢失的问题

unity音乐游戏开发,导入角色模型并解决材质问题

yizhigou1的博客 1762

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

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

Laurence的技术博客 1763

STM32 FDCAN热插拔恢复机制与自动重发功能优化

本文深入分析了STM32 FDCAN在热插拔场景下触发bus-off状态导致通讯中断的根本原因,指出自动重发功能是问题关键。通过禁用自动重发、配置硬件自动恢复机制及优化总线参数,实现了FDCAN热插拔后的100%稳定恢复,为工业应用提供了可靠的CAN总线解决方案。

ice55的博客 685

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

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

baidu_38860188的博客 1800

ADS2023实战:手把手教你用Load-Pull设计40W LDMOS功率放大器(附工程文件)

本文以飞思卡尔MRF8P9040N LDMOS晶体管为例,详细介绍了在ADS 2023中设计一款40W功率放大器(PA)的全流程。内容涵盖从直流偏置设置、稳定性分析、核心的负载牵引(Load-Pull)仿真,到基于Smith圆图的匹配网络设计、谐波平衡性能验证,直至版图生成与优化。文章提供了手把手的实战指导和工程文件,旨在帮助射频工程师掌握高效率PA的设计方法与关键技巧。

cake8的博客 1071

深信服AF设置安全防护策略

防火墙设置安全防护策略,禁止用户访问指定网站

m0_64423407的博客 4836

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

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

weixin_43790276的博客 5450

YOLO26优化:特征融合 | 一种新颖的多尺度特征融合iAFF,适配小目标检测

在YOLO26中如何使用:iAFF加入Neck替代Concat;

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 270

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

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

qq_43439853的博客 3122

揭秘大厂 Unity 红点系统设计:别小看右上角那颗小红点,它能把你项目搞崩

本文详细探讨了游戏大厂如何设计高性能红点系统。红点作为提升用户活跃和转化率的重要工具,需要支持多级联动、动态判断和全局一致性。系统采用观察者模式和树形结构,分为数据管理、逻辑判定、订阅通知和UI展示四大模块,通过事件驱动方式实现高效刷新。文章特别强调了解耦设计、配置化管理和性能优化,并提出了热更新、数据分析等高级应用场景。最终指出,优秀的红点系统需要架构标准化、自动化配置和团队紧密协作,是大型游戏项目的关键技术基础。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 377

PON架构(全光网络)

目前组网架构世界上有一种最快的速度又是光,以前传统以太网络规划满足不了现在的需求。有线网 无线网 全光网络方案场景 全光网络分类 以太全光网络 PON(Pas-sive-Optical Network 无源光网络) 再典型的中大型高校网络中 推荐万兆入室 千兆到桌面的带宽设计 一般三层 (终端-接入层-汇聚层-核心层-出口(安全设备)-互联网) 单校区核心设备 一般采用两台高性能的核心交换机 双机的方式采用的是 M-LAG 多校区之间核心交换机采用1

qq_56248592的博客 6269

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

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

Dontla的博客 1098

解锁机器人动态平衡算法:从原理到实践

机器人的动态平衡,是指机器人在运动过程中,面对各种复杂的动态变化和外界干扰,依然能够维持稳定状态,不发生倾倒或失去控制的能力。它就像是一位技艺精湛的舞者,在舞台上翩翩起舞时,无论做出多么复杂的动作,都能巧妙地调整身体姿态,始终保持平衡,展现出优美的舞姿。在实际应用中,机器人的动态平衡对于其稳定运行起着至关重要的作用。以双足机器人为例,当它行走在不平整的地面上时,地面的起伏会使机器人的重心不断发生变化。如果没有良好的动态平衡能力,机器人就很容易因为重心偏移而摔倒,无法完成行走任务。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 3838

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

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

weixin_34124939的博客 1840

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Python伪私有属性总结

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

路虽远,行则必至! 1241

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

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

weixin_39890289的博客 786

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

系统学习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、付费专栏及课程。

余额充值