Python变量中 _xx、__xx和__xx__的区别

Python中__init__的用法和理解 在Python中定义类经常会用到__init__函数(方法),首先需要理解的是,两个下划线开头的函数是声明该属性为私有,不能在类的外部被使用或访问。而__init__函数(方法)支持带参数类的初始化,也可为声明该类的属性(类中的变量)。__init__函数(方法)的第一个参数必须为self,后续参数为自己定义。 从文字理解比较困难,通过下面的例子能非常容易理解这个概念: 例如我们定义一个Box... 阅读详情

 转自:python _、__和__xx__的区别 - cococo点点 - 博客园,方便自己查阅有细微修改。

结论

  • 使用_xx来表示私有。
  • 使用__xx来避免被子类重写。
  • 使用__xx__来创建一个用于python调用或一些特殊情况时

"_"单下划线

Python中不存在真正的私有方法。为了实现类似于c++中私有方法,可以在类的方法或属性前加一个“_”单下划线,意味着该方法或属性不应该去调用,它并不属于API。

在使用property时,经常出现这个问题:

class BaseForm(StrAndUnicode):
    ...
    
    def _get_errors(self):
        "Returns an ErrorDict for the data provided for the form"
        if self._errors is None:
            self.full_clean()
        return self._errors
    
    errors = property(_get_errors)

上面的代码片段来自于django源码(django/forms/forms.py)。这里的errors是一个属性,属于API的一部分,但是_get_errors是私有的,是不应该访问的,但可以通过errors来访问该错误结果。

"__"双下划线

这个双下划线更会造成更多混乱,但它并不是用来标识一个方法或属性是私有的,真正作用是用来避免子类覆盖其内容。

让我们来看一个例子:

class A(object): 
    def __method(self): 
        print "I'm a method in A" 
    def method(self): 
        self.__method() a = A() a.method()

输出是这样的:

$ python example.py 
I'm a method in A

很好,出现了预计的结果。

我们给A添加一个子类,并重新实现一个__method:

class B(A): 
    def __method(self): 
        print "I'm a method in B" 

b = B() 
b.method()

现在,结果是这样的:

$ python example.py
I'm a method in A

就像我们看到的一样,B.method()不能调用B.__method的方法。实际上,它是"__"两个下划线的功能的正常显示。

因此,在我们创建一个以"__"两个下划线开始的方法时,这意味着这个方法不能被重写,它只允许在该类的内部中使用。

在Python中如是做的?很简单,它只是把方法重命名了,如下: 

a = A()
a._A__method()  # never use this!! please!
$ python example.py 
I'm a method in A

如果你试图调用a.__method,它还是无法运行的,就如上面所说,只可以在类的内部调用__method。

"__xx__"前后各双下划线

当你看到"__this__"的时,就知道不要调用它。为什么?因为它的意思是它是用于Python调用的,如下:

>>> name = "igor" 
>>> name.__len__() 
4 
>>> len(name) 
4 
>>> number = 10 
>>> number.__add__(20) 
30 
>>> number + 20 
30

“__xx__”经常是操作符或本地函数调用的magic methods。在上面的例子中,提供了一种重写类的操作符的功能。

在特殊的情况下,它只是python调用的hook。例如,__init__()函数是当对象被创建初始化时调用的;__new__()是用来创建实例。

class CrazyNumber(object):
    def __init__(self, n): 
        self.n = n 
    def __add__(self, other): 
        return self.n - other 
    def __sub__(self, other): 
        return self.n + other 
    def __str__(self): 
        return str(self.n) 

num = CrazyNumber(10) 
print num # 10
print num + 5 # 5
print num - 20 # 30    

另一个例子

class Room(object):
    def __init__(self): 
        self.people = [] 
    def add(self, person): 
        self.people.append(person) 
    def __len__(self): 
        return len(self.people)
 
room = Room() 
room.add("Igor") 
print len(room) # 1

局域网ip冲突检测工具_python 小工具实现 windows笔记本与 ipad数据互传 宅在家没事的时候就开始琢磨ipad的进阶使用,由于没有mac无法隔空投送,ipad与windows的数据交互表现极差,所以设计了这个ftp小工具。当然,这个工具不仅仅能用于windows与ipad,还可以用于局域网任意两台设备之间程序源码与下载见文章末尾使用说明windows端:biubiubiu.exeipad端: appsotre下载 FE文件管理器windows端操作在c盘下创建ftp目录... 阅读详情

相关推荐

ESXI 7 :创建统信V20_1050d服务器系统虚拟机

记录一下在 X86 架构创建统信V20_1050d 虚拟机遇到的问题。已遇到的问题有①:常规服务器环境下网络连接失败重点:按照桌面版本,有问题处理简单。

guyuelin123的博客 1968

Python中_和__的区别

Python中_和__的区别是: ‘_’:单前置下划线,私有化属性和方法,类对象和子类可以访问。 ‘__':双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问。 详细描述: xx:公有变量,所有对象都可以访问。 _xx:单前置下划线,私有化属性和方法,for 包名import *禁止导入,类对象和子类可以访问,使用对象._变量名调用。 __xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问,应使用对象._类名__变量名调用。 __xx..

phmatthaus的专栏 3435

揭秘大型语言模型:从神经元到思维透明的奇妙旅程

这篇博客带你走进大型语言模型的内部世界,从神经元的小任务,到功能向量的团队合作,再到层间的协作和思维的透明化。掌握这些知识,能让你在开发中更高效地优化AI,在研究中更深入地探索模型的奥秘。建议多动手实践,把这些理论变成自己的能力!

数据与算法架构提升之路专栏 1520

python中_与__的区别

1.单下划线(伪私有,声明私有) 伪私有变量:变量前的单下划线表示表面上私有 ,但是其实这样的实例变量外部是可以访问的,只是一种约定,不要随意访问。 2.双下划线(变量或方法) 变量前的双下划线表示真正的私有,实际上的私有,只有内部可以访问,但是可以通过在类中自定义方法进行操作 >>> class MyName: ... _name = "w1" ... __namedede = "w2" ... >>> print(MyName._name) w1 &

pygodnet的博客 1169

使用 ChatGPT/Copilot 提升前端开发效率的 N 种方式

typescript// 输入:根据这个 JavaScript 对象,生成完整的 TypeScript 类型定义id: '123',stock: 50,},// ChatGPT 生成:id: string;discount?: number;// 可选属性// 只读属性// 更进一步,生成 Zod schema 用于运行时验证:});}),});AI 代码助手真正的革命性不在于它能生成多少代码,而在于它改变了我们解决问题的方式。

fineday 1592

电工电子实验——3BIT延时电路的设计与实现

设计一个 3BIT延时电路。 设计分析: Ⅰ.根据触发器的特性,只有来两个触发脉冲时才能恢复到原来的状态。也就是说触发器的输出信号比触发信号延迟了一个触发脉冲周期即1bit。据此3bit就需要3个触发器。 Ⅱ.输出要可控就要加一控制器,可用选择器实现。 Ⅲ.为便于观察输出信号的延迟,可设计一个F1信号。

qq_55543315的博客 1128

Python中使用包含_和__的变量名之间的区别

含义:成员的私有成员变量,就像Java中用protected关键字修饰一样。含义:成员的私有成员变量,就像Java中用private关键字修饰一样。作用:只允许当前类创建的对象和子类对象访问此变量。外部无法访问此变量。作用:只允许当前类对象访问,不允许子类对象和外部对象访问。例子:__count、__temp。含义:Python特有的魔术方法。例子:_count、_temp。

我要夺回那失落的荣光 399

百度智能云ASR实战:5分钟搞定Unity语音转文字(含完整代码)

本文详细介绍了如何在Unity中集成百度智能云ASR服务,实现高效的语音转文字功能。从环境配置、音频处理到服务端通信,提供完整代码示例和实战优化技巧,帮助开发者快速实现语音交互功能,适用于游戏开发、XR应用等场景。

ujm56789012的博客 215

python 中_和__的区别

_和__的区别 xx:公有变量,所有对象都可以访问; _xx:单前置下划线,私有化属性和方法,for 包名 import * 禁止导入,类对象和子类可以访问,使用对象._变量名调用; __xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问,应使用对象._类名__变量名调用; xx:双前后下划线,用于定义类的魔法属性/模法方法,例如:init,__str__等,无法直接调用; xx...

小胖_@的博客 1440

Realtek RTD1319D芯片解析:H.266与AV1双解码的机顶盒SoC

视频编解码技术是数字媒体传输的核心,H.266/VVC作为新一代标准,相比H.265提升50%压缩效率,显著降低带宽需求。其实现原理依赖于专用硬件解码器和并行处理架构,在超高清视频传输领域具有重要价值。Realtek RTD1319D作为首款商用H.266处理器,采用异构计算设计,集成四核ARM CPU和独立视频处理单元,同时支持AV1解码,兼顾市场兼容性。该SoC特别适合4K机顶盒、数字标牌等应用场景,其HDMI 2.1a接口和DVB解调器为超高清内容传输提供完整解决方案。开发时需注意散热设计和内存配置优

weixin_42591413的博客 671

BLE天线设计避坑:NRF52832官方50欧姆阻抗匹配的3个常见误区

本文深入解析NRF52832蓝牙SoC天线设计中的常见误区,重点探讨50欧姆阻抗匹配的3个关键问题:PCB板材介电常数差异、匹配元件寄生参数及VSWR测试。通过实测数据和优化方案,帮助工程师规避设计陷阱,提升BLE通信性能。

beer8的博客 214

if xx: 与if xx is not None:

主要是为了记录python中的if xx: 与if xx is not None:细节问题。 if xx is not None: = if xx != None if xx: = if xx != None and xx != " " and xx != False and xx != 0 and xx != [] and xx != {} and.... xx is not None 只是判断xx是不是 None 类型,如果不是None 类型,则返回True。 假设xx==0, 那么 if xx 返回值

weixin_45432553的博客 1099

立创开源便携式多生理参数监护仪:基于STM32H743与ADS1292R的心电血氧体温监测系统设计

本文详细解析了基于STM32H743与ADS1292R的便携式多生理参数监护仪开源设计。项目集成了心电、血氧和体温监测功能,采用模块化硬件架构,并重点介绍了利用FIR滤波和Pan-Tompkins算法进行心电信号处理的核心技术。文章提供了完整的复刻指南与避坑要点,是学习医疗电子设备设计的优秀实践案例。

weixin_30600615的博客 327

Python 类中方法的内部变量,命名加'self.'变成 self.xxx 和不加直接 xxx 的区别 ---学习记录

转载至:https://blog.youkuaiyun.com/jojoy_tester/article/details/54016309先看两个类的方法:[python] view plain copy>>> class nc():      def __init__(self):          self.name ='tester'  #name变量加self           &...

hey_man2017的博客 5987

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

python 类中的 _xx, __xx, __xx__区别

python 类中的 _xx, __xx, __xx__区别 1,区别整理 项目 作用 类内部使用 子类使用 作为API使用 说明 xx 公有变量/方法 ● ● ● 作为API提供外部调用 _xx 保护变量/方法 ● ● ☓ 不作为API提供外部调用;但是能够被子类继承 __xx 私有变量/方法 ● ☓ ☓ 不作为API提供外部调用;也不能被子类继承使用 _...

bigear_yu的博客 1045

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Python中“xx+=xx”与“xx=xx+xx”的区别

Python中“+=”与“xx=xx+xx”的区别:

IT晓可程序员之路 2251

VB摄像头监控

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

关于import和from xx import xx

一、关于导入模块 1在导入模块的一瞬间,解释其会先通过sys.modules来判断该模块是否已经导入了,True 则不再重复导入,False则会做三件事   1为导入的模块创立心的名称空间   2在心创建的名称空间中运行该代码中的代码   3创建模块的名字,并使用该名称空间作为该模块的当前模块中引用的名字 2关于 " __name__"=="__main__":   当我们把一个模块作...

weixin_30641465的博客 339

Python中类的变量,一会一个下划线一会两个下划线,到底有什么区别?

Python中类的变量,一会一个下划线一会两个下划线,到底有什么区别? 下划线与变量的组合一共有以下三种情况,搞清楚他们之间的关系会很有帮助! 形似 功能 __xx 这是私有变量, 只有内部可以访问,外部不可以访问。但是也不是一定不可以访问,只是解释器把该变量解释成 类名__xx 。但最好不要这样做,养成良好编程习惯 _x 这是实例变量,可以访问,但是不要轻易访问。按照约定俗...

bbj1030的博客 2163

Python下划线中 _xx、__xx、__xx__ 的区别

在Python中,一般情况下我们常见的变量大都属于公共变量,比如 xx = 13 中的 xx 就是一个公共变量,但有时候我们也会在一些Python代码中看到一些加下划线的变量/方法,比如` _xx`、`__xx`、`__xx__`,我们今天就来学习下这几个的区别。...

Python热爱者的博客 466

python import和from xx import xx的理解

python import, from xx import xx的一些理解, 以及解答一些from xx import xx可以, import xx无效的情况先挂标准解释原文翻译(google)主要讨论import 和 from import通俗理解不讲概念了, 直接案例先使用import接着from import在flask中不使用blueprint, 又想分文件, 所有遇到改问题 先挂标准解...

flyinghu123的博客 3165

Python中类中属性元素self.xx和直接使用xx的区别简述

Python中类中属性元素self.xx和直接使用xx的区别简述不加self情况加self情况 不加self情况 在类级别:表示为类的一个属性,可以作为全局变量来使用,可以作为类属性或对象属性被调用 class Example(object): a =10 def __init__(self): self.a = 1 # 若注释这句 则my_instance.a ...

LuciusJAY的博客 4067

python from. import失败_python import xx和from xx import x 中的坑

先回顾一下理解程度什么是不可变类型和可变类型?可变类型是,修改变量后 引用的内存地址不变,引用的内存中的内容发生变化(是针对变量名的引用来理解)。#在a.py中定义了一个test属性test = [1, 2]print(test ,id(test))test.append('jack')print(test, id(test))结果C:\Users\jackendoff\AppData\Local...

weixin_39722563的博客 953

self.xx与_xx区别

版权声明:本文为延成原创文章,转载请标明出处 self.xx是调用的xx属性的get/set方法,而_xx则只是使用成员变量_xx,并不会调用get/set方法 使用原则: 在类内部访问变量的时候用“_”; 在类外部也就是其他类里访问这个类的变量时用“.” 语法; ...

延成的博客 488

python _、__和__xx__的区别

python _、和__xx的区别

_icrazy_的博客 305

python变量——单下划线和双下划线的区别

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33964094的博客 469

Python中 from xx import xx 和import xx 有什么区别

​在Python中,from xx import xx和import xx的区别在于导入模块的方式和使用方法。 1.import xx:这种方式会将整个模块导入到当前命名空间中,可以通过模块名访问其内部定义的函数、类等。 2.from xx import xx:这种方式只会导入指定的函数、类或变量,而不是整个模块。这样可以避免命名冲突,同时也可以减少内存占用。然后你可以直接使用sqrt()而不是math.sqrt()

无知的人很多,我也是一个。 583
上一篇: 1012 The Best Rank (25)(25 分)
下一篇: GoldenDict使用说明
Watson_R
博客等级 码龄10年 15粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值