美文网首页
python 中假私有数据

python 中假私有数据

作者: coke613 | 来源:发表于2018-11-04 19:36 被阅读0次

    在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

    相关文章

      网友评论

          本文标题:python 中假私有数据

          本文链接:https://www.haomeiwen.com/subject/ddllxqtx.html