美文网首页
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 中假私有数据

    在Python中,对一个属性或者一个方法进行私有,往往通过__ 来进行修饰,它不向Java中,可以使用privat...

  • python面向对象2

    1.权限访问: 2.python中类的内容的访问权限 严格来说,python类中的内容只有公开的;私有化是假的私有...

  • Python学习总结【连载】(十三)

    Python学习总结【连载】(十三) 2018.06.28 Juttachen 概述 42 属性私有化 43 假的...

  • day15_python_类和对象

    属性的私有化 python中并没有真正的私有化!python 的类中默认的属性和方法都是公开的 1.私有化a.类中...

  • 2018-06-28 python 类的私有变量和私有方法

    转发python 类的私有变量和私有方法 类的私有变量和私有方法在Python中可以通过在属性变量名前加上双下划线...

  • day014 笔记 08-01

    内置类的属性 python中每个类都拥有内置的类属性。 私有化 python中类中的属性和方法的私有化:直接在属性...

  • day13面向对象(1)

    01-内置类属性 内置类属性:python中每个类都拥有内置的类属性 02私有化 python中,类和属性的私有化...

  • Python私有属性(private attributes)及其

    Python中的私有属性 在面向对象(Object Oriented Design)的情景下,所谓私有属性(pri...

  • day-16类和对象

    私有化 python的私有化 python中在属性前面加两个下划线,就可以将属性或者方法私有化(只能两个下划线开头...

  • P 面向对象 | 伪私有属性与私有方法(科普)

    一、私有属性与私有方法 Python中,是没有真正意义上的私有的 私有属性与私有方法是对象的隐私,通常用于做一些内...

网友评论

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

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