本篇文章给大家带来的内容是关于Python访问限制私有还是公有的介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

一、知识点

在一个模块中,我们可能会定义很多函数和变量。但有的函数和变量我们希望能给别人使用,有的函数和变量我们希望仅仅在模块内部使用,so?

我们可以通过定义该函数、变量是公开的还是私有的来达到该目的。

在Python中,是通过下划线“_”前缀来实现的。

public:公开的。正常的函数和变量名为此类型,可以被直接引用。比如变量abc、PI等;

特殊变量:格式为__xxx__ ,以__开头、以__结尾。可以直接被引用,但是有特殊用途。比如 __author__ 、__name__就是特殊变量。一般自己定义的变量不要用这种变量名。

private:私有的、非公开的,格式类似于_xxx_ 和__xxx,例如__num。

不应该被直接引用,只有内部可以访问,外部不能访问。

不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮。

二、举例说明

在Class类内部,可以有属性和方法。而外部代码可以通过直接调用实例变量的方法来操作数据,隐藏了内部复杂逻辑。但是,外部代码还是可以自由地修改一个实例的属性。例如:>>>b.score

99

>>>b.score = 59

>>>b.score

59

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线“__”,变成私有变量,如下:class Student(object):

def __init__(self, name, score):

self.__name = name

self.__score = score

def print_score(self):

print('%s: %s' % (self.__name, self.__score))

尝试在外部对属性进行访问,发现会报错,因为私有变量,不能被外部访问。>>> bart = Student('Bart Simpson', 98)

>>> bart.__name # 私有变量:不能被外部访问

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'Student' object has no attribute '__name'

但是,如果外部代码要获取name和score怎么办?

给Student类增加获取属性的方法:get_name()和get_score(),如下:class Student(object):

...

def get_name(self):

return self.__name

def get_score(self):

return self.__score

如果外部代码修改score怎么办?可以再给Student类增加设置方法:set_score():...

def set_score(self, score):

# 避免传入无效参数

if 0 <= score <= 100:

self.__score = score

else:

raise ValueError('bad score')

那作为双下划线开头的私有实例变量是不是一定不能从外部访问呢?其实也不是。

不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以仍然可以通过_Student__name来访问__name变量。>>> bart = Student('Bart Simpson', 98)

>>> bart.get_name()

'Bart Simpson'

>>> bart.__name = 'New Name' # 给bart新增的__name变量

>>> bart.__name # !与class内部的__name变量不是一个变量!

'New Name'

>>> bart.get_name() # get_name()内部返回self.__name (_Student__name)

'Bart Simpson'

表面上看,外部代码“成功”地设置了__name变量,但实际上这个__name变量和class内部的__name变量不是一个变量!内部的__name变量已经被Python解释器自动改成了_Student__name,而外部代码给bart新增了一个__name变量。

所以python并没有一种方法可以完全限制访问private的函数或变量,所以不是“不能被直接引用”,从编程的习惯上不应该引用private函数或变量。那他们的用处呢?

例如:def _private_1 (name):

return 'hello,%s ' % name

def _private_2 (name):

return 'hi , %s ' % name

def greeting(name):

if len(name) > 3:

return _private_1 (name)

else:

return _private_2 (name)

在模块里公开greeting()函数,而把内部逻辑用private函数隐藏起来了。这样,调用greeting()函数不用关心内部的私有函数的细节。

这是一种非常有用的代码封装和抽象的方法,即:外部不需要引用的函数全部定义成private,只有外部需要引用的函数才定义为public。

三、完整代码class Student(object):

def __init__(self, name, score):

self.__name = name

self.__score = score

def print_score(self):

print('%s: %s' % (self.__name, self.__score))

def get_name(self):

return self.__name

def get_score(self):

return self.__score

def set_score(self, score):

# 避免传入无效参数

if 0 <= score <= 100:

self.__score = score

else:

raise ValueError('bad score')

def _private_1 (name):

return 'hello,%s ' % name

def _private_2 (name):

return 'hi , %s ' % name

def greeting(name):

if len(name) > 3:

return _private_1 (name)

else:

return _private_2 (name)

python私有成员与公有成员_Python访问限制私有还是公有的介绍(附示例)相关推荐

  1. 微课|中学生可以这样学Python(7.3.1节):私有成员与公有成员

    适用教材: 董付国,应根球.<中学生可以这样学Python>.清华大学出版社,2017. 第7章  面向对象程序设计 7.3.1  私有成员与公有成员 京东购买链接:https://ite ...

  2. python类中私有成员和方法的访问

    1.私有成员的访问 python类中的私有成员和方法内的私有成员(在python中以__开头的变量),在类外只能通过类中定义的方法来进行访问,或者用一种特殊的方式a._A__value(a是对象,A是 ...

  3. python定义私有变量的方法_Python怎么修改私有属性 如何访问python类中的私有方法...

    python 类为什么不能定义私有属性和方法 因为b.name[0] = 'zhang'修改的是类属性,类属性是全局的,所有的实例共享,如果想私有化,可以添加 def __init__( self ) ...

  4. 4.1.2 私有成员与公有成员

    从形式上看,在定义类的成员时,如果成员名以两个下划线(__)开头则表示是私有成员,但是Python并没有对是有成员提供严格访问保护机制.私有成员在类的外部不能直接访问,一般是在类的内部进行访问和操作, ...

  5. python私有变量什么意思_python为什么有私有方法和变量

    1. 访问安全,其实也没有决定的安全 >>> class humer(object): ... def __init__(self, name): ... self.name = n ...

  6. python协程库_python中协程的详解(附示例)

    本篇文章给大家带来的内容是关于python中协程的详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 协程,又称微线程,纤程.英文名Coroutine 协程看上去也是子程序 ...

  7. python获取局域网在线主机_python通过scapy获取局域网所有主机mac地址示例

    python通过scapy获取局域网所有主机mac地址示例 发布于 2014-10-10 20:34:48 | 607 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python ...

  8. python小数点进位小学数学_python小数的进位与舍去的介绍(附代码)

    本篇文章给大家带来的内容是关于python小数的进位与舍去的介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一.基础知识准备 奇进偶舍,又称为四舍六入五成双规则.银行进 ...

  9. python发送短信内容_Python实现发短信的方法介绍(附代码)

    本篇文章给大家带来的内容是关于Python发短信的方法介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. #首先注册互亿无线,然后复制发短信界面右上角的apiid和apik ...

最新文章

  1. 让烦恼走开 两招让移动硬盘插拔自如
  2. 团队成员怎样进行工作汇报?
  3. 监控haproxy的脚本
  4. base64补等号规则说明
  5. java web 多语言_基于 Selenium WebDriver 实现多语言环境下自动化截图
  6. Nginx(二):安装、配置、常用命令
  7. 苹果和虫子(信息学奥赛一本通-T1038)
  8. 使用C#开发ActiveX控件
  9. C++ 抛出和接收异常的顺序
  10. Linux-iptables初识
  11. module.exports 与 exports区别
  12. 删除-驱动人生节能省电方案
  13. 综治应急指挥中心建设方案
  14. go语言复数包_复数 | Go语言圣经
  15. android测试命令,Android Instrument测试命令使用小记
  16. 如何设置阿里云Web应用攻击防护?
  17. 灿烂星空,你是真的英雄
  18. 省社科基金本子评审标准总结
  19. [Mur-001] Mur源码分析之一
  20. Vue 官方成员 Hcy:怎么才能有尤雨溪一半强,该怎么学习?

热门文章

  1. 【面试刷题复习】更新中 2021.8.30
  2. 声压级和灵敏度的关系
  3. Android内核开发:浅析APK的安装过程
  4. linux 合并csv文件 cat,Python:将两个CSV文件合并为多级JSON
  5. python怎么读取图片文件大小_python怎么读取图片大小
  6. Log4j2 高危漏洞分析
  7. Java基础教程【第一章:Java概述】
  8. 人越是没钱,越要戒掉这4点毛病,否则穷苦一辈子!
  9. Apache配置文件httpd.conf详解
  10. vscode 不支持的客户端_Windows平台上有哪些你不知道的神器?