单下划线和双下划线(私有变量和公有变量)

“单下划线” 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量;
“双下划线” 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。

以单下划线开头(_foo)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from xxx import *”而导入;以双下划线开头的(__foo)代表类的私有成员;以双下划线开头和结尾的(__foo__)代表python里特殊方法专用的标识,如 __init__()代表类的构造函数。
结论:
1、_xxx 不能用于from module import * 以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问。
2、__xxx 双下划线的表示的是私有类型的变量。只能是允许这个类本身进行访问了。连子类也不可以
3、__xxx___ 定义的是特列方法。像__init__之类的

单下划线和双下划线的执行代码和实际调用代码

In [11]: class A():
    ...:     def __function(self):
    ...:         print("x")
    ...:

In [12]: a = A()

In [13]: a._A__function()
x

In [14]: a.__function()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-14-d28aedf4bdb5> in <module>()
----> 1 a.__function()

AttributeError: 'A' object has no attribute '__function'
# 同时,在class A中对于以前__function()的调用会被自动替换成对于_A__function()的调用。

私有变量

In [15]: class A(object):
    ...:     def __init__(self):
    ...:         self.__private()
    ...:         self.public()
    ...:     def __private(self):
    ...:         print('A.__private()')
    ...:     def public(self):
    ...:         print('A.public()')
    ...:

In [16]: class B(A):
    ...:     def __private(self):
    ...:         print('B.__private()')
    ...:     def public(self):
    ...:         print('B.public()')
    ...:

In [17]: b = B()
A.__private()#因为调用A的构造函数时,加双下划线的是私有变量只有类对象自己能访问,连子类对象也不能访问到这个数据.
B.public()#调用A的构造函数时,子类B的public方法覆盖父类A的Public方法。

公有变量

In [18]: class A(object):
    ...:     def __init__(self):
    ...:         self._private()
    ...:         self.public()
    ...:     def _private(self):
    ...:         print('A._private()')
    ...:     def public(self):
    ...:         print('A.public()')
    ...:

In [19]: class B(A):
    ...:     def _private(self):
    ...:         print('B._private()')
    ...:     def public(self):
    ...:         print('B.public()')
    ...:

In [20]: b = B()
B._private()
B.public()
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值