python私有成员只能内部访问,python 中假私有数据

在Python中,对一个属性或者一个方法进行私有,往往通过__ 来进行修饰,它不向Java中,可以使用private, protect, public,关键字进行修饰说明,修饰权限不同,所代表的访问权限也不同.

Java 访问权限

权限修饰符

表示含义

private

私有,只能自己访问自己,外界访问不到,包括子类

protect

介于private 和 public 之间,只能自己或者其子类调用,除此外,其他类访问不到

默认修饰符,什么都不声明

在同一个包下,无论是属性还是方法,可以跨类访问

public

公共的,无论是属性还是方法,可以跨类访问,跨包也可以访问

Python 访问权限

权限修饰符

表示含义

_

保护变量,只能类,或者对象可以使用

__

私有成员,只能类对象自己访问,实例对象不可以访问

默认修饰符,什么都不声明

公共的,类对象可以使用,实例对象也可以使用

_ & __ 区别:

1: " _ " 单划线开头成员变量称为受保护变量,只有类对象和子类对象自己能访问到这些变量;

2:" __ " 双下划开头成员变量成为私有变量,只有类本身可以访问,子类对象不可以进行访问.

3:以 from XXXX import * 这种方式不能导入 "_"下划线开头的变量.

单下划线开头的变量访问

5e12acfec1d1

Demo.py.png

5e12acfec1d1

DemoTest.py.png

5e12acfec1d1

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值