python 中假私有数据

2018-11-04  本文已影响0人  coke613

在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

上一篇下一篇

猜你喜欢

热点阅读