Python中单下划线和双下划线

本文深入探讨Python中特殊方法的作用,如运算符重载和截获,以及伪私有属性如何避免变量冲突,通过实例展示了__init__、__add__等方法和双下划线变量的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

结合书籍,我的理解:

前后双下划线的类中的方法:是特殊方法,用于运算符重载,可以截获运算符。
比如__init__(...)可以截获类的实例化类名()
__add__可以截获 +;
__str__可以截获 print;
__getitem____setitem__ 可以截获 切片 []。

伪私有属性:私有是指不应该修改,伪私有是指可以修改。

单下划线开头的内部名称:是伪私有属性,是不应该修改的,但实际可以被修改;
class 语句内,双下划线开头但不以双下划线结尾的变量名:会自动扩张,从而包含所在类的名称。例如,C类内的__x会自动变成_C__x。修改后的变量名包含了所在类的名称,所以变得独特。不会和同一层次中的其他类所创建的相同变量名产生冲突。

为什么使用伪私有属性?
先来看看不使用伪私有属性,会产生什么问题。

class C1:
        def meth1(self):        self.x = 8
        def meth2(self):        print(self.x)

class C2:
        def metha(self):        self.x = 9
        def methb(self):        print(self.x)

class C(C1,C2): pass

I1 = C()
I1.meth1()
I1.metha()
I1.meth2()

print('----')

I2 = C()
I2.metha()
I2.meth1()
I2.meth2()

输出:

9
----
8

也就是说,self.x的值取决于它最后被哪个类的哪个方法所赋值。

使用伪私有属性,解决上述问题:

class C1:
        def meth1(self):
                self.__x = 1
        def meth2(self):
                print(self.__x)


class C2:
        def metha(self):
                self.__x = 2
        def methb(self):
                print(self.__x)


class C(C1, C2):
        pass


I = C()

I.meth1()
I.metha()
print(I.__dict__)
I.meth2()
I.methb()

输出:

{'_C2__x': 2, '_C1__x': 1}
1
2

参考文献:

  1. 《Python 学习手册(第 4 版)》- 第 26 章 - 类可以截获 Python 运算符 - P638——P641;
  2. 《Python 学习手册(第 4 版)》- 第 30 章 - 类的伪私有属性 - P751——P754;
  3. 7-python中单下划线和双下划线
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值