在Python中,对一个属性或者一个方法进行私有,往往通过__ 来进行修饰,它不向Java中,可以使用private, protect, public,关键字进行修饰说明,修饰权限不同,所代表的访问权限也不同.
Java 访问权限
权限修饰符 | 表示含义 |
---|---|
private | 私有,只能自己访问自己,外界访问不到,包括子类 |
protect | 介于private 和 public 之间,只能自己或者其子类调用,除此外,其他类访问不到 |
默认修饰符,什么都不声明 | 在同一个包下,无论是属性还是方法,可以跨类访问 |
public | 公共的,无论是属性还是方法,可以跨类访问,跨包也可以访问 |
Python 访问权限
权限修饰符 | 表示含义 |
---|---|
_ | 保护变量,只能类,或者对象可以使用 |
__ | 私有成员,只能类对象自己访问,实例对象不可以访问 |
默认修饰符,什么都不声明 | 公共的,类对象可以使用,实例对象也可以使用 |
_ & __ 区别:
1: " _ " 单划线开头成员变量称为受保护变量,只有类对象和子类对象自己能访问到这些变量;
2:" __ " 双下划开头成员变量成为私有变量,只有类本身可以访问,子类对象不可以进行访问.
3:以 from XXXX import * 这种方式不能导入 "_"下划线开头的变量.
单下划线开头的变量访问
Demo.py.png DemoTest.py.png Error.png我们在Demo.py模块,定义了全局变量(_num),并且输入打印(_num)
在DemoTest.py模块,使用 from Demo import * 的方式导入Demo模块,
并调用Demo模块中的(_num)变量,运行DemoTest.py,程序崩溃:
Traceback (most recent call last):
File "DemoTest.py", line 5, in <module>
print(_num)
NameError: name '_num' is not defined
那么我们直接调用Demo.py,访问(_num)
10
当然在其他模块中还有另一种方式调用Demo.py,使用 import Demo,此时程序会不会正常运行呢?
#修改DemoTest.py 模块:
#coding=utf-8
# from Demo import *
import Demo
print(Demo._num)
终端运行:
xxxxxideMacBook-Pro:xxxxx xxxxx$ python DemoTest.py
10
10
xxxxxdeMacBook-Pro:xxxxx xxxxx$
咦,程序正常输出_num 的值, 但是为啥输出了两个10呢?
我们回过头看程序,在Demo.py 中,除了定义了一个单下划线开头的num变量,除此外我们还是用print 输出该变量值,而在DemoTest.py,中,再次调用输出变量_num的值,这样一共打印了两次.
双下划线开头的变量访问
class Demo(object):
__age = 10
print(Demo.__age)
运行结果:
xxxxxdeMacBook-Pro:xxxxx xxxxxx $ python Demo__.py
Traceback (most recent call last):
File "Demo__.py", line 9, in <module>
print(Demo.__age)
AttributeError: type object 'Demo' has no attribute '__age'
哎 ,Demo 类明明声明了__age 属性,为什么会报这样的错呢?
被"双下划线"开头的变量或者方法称为私有,只有类本身可以访问,那么我们继续修改代码
#coding=utf-8
class Demo(object):
__age = 10
# print(Demo.__age)
print(Demo._Demo__age)
运行结果:
10
咦~ print(Demo._Demo__age),这打印的是什么东西呢?在Demo类中好像就没有声明这个变量.程序不报错,反而打印10呢?
我们继续修改代码:
class Demo(object):
__age = 10
# print(Demo.__age)
# print(Demo._Demo__age)
for temp in dir(Demo):
print(temp)
运行结果:
_Demo__age
__class__
__delattr__
__dict__
__doc__
__format__
__getattribute__
__hash__
__init__
__module__
__new__
__reduce__
__reduce_ex__
__repr__
__setattr__
__sizeof__
__str__
__subclasshook__
__weakref__
dir函数用于显示模块中定义的标识符的, 包括函数、变量、类.有木有觉得的_Demo__age很熟悉,是不是print输出的变量.
在python中定义私有变量只需要在变量名或函数名前加上 ”__“两个下划线,那么这个函数或变量就会为私有的了。
在内部,python使用一种 name mangling 技术,将 __membername替换成 _classname__membername,所以你在外部使用原来的私有成员的名字时,会提示找不到.
总结
1._xxx 不能用于,from xxxx import * ,保护类型只能本身或者子类进行访问.
2.__xxxx 私有,只能在类中使用,其他类不能使用,如果非要使用可以 _className__membername这种方式访问,但不建议这样做.
3._XX _这种定义的方法,带有特殊含义的方法
4.import XXX 将整个模块导入, 在调用时,需跟随模块名称
5.from XXX import * , 将XXX中所有方法,及成员变量导入, 也可以导入指定方法,但不包括模块中的 _XXX
网友评论