python私有成员与公有成员_Python访问限制私有还是公有的介绍(附示例)
本篇文章给大家带来的内容是关于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访问限制私有还是公有的介绍(附示例)相关推荐
- 微课|中学生可以这样学Python(7.3.1节):私有成员与公有成员
适用教材: 董付国,应根球.<中学生可以这样学Python>.清华大学出版社,2017. 第7章 面向对象程序设计 7.3.1 私有成员与公有成员 京东购买链接:https://ite ...
- python类中私有成员和方法的访问
1.私有成员的访问 python类中的私有成员和方法内的私有成员(在python中以__开头的变量),在类外只能通过类中定义的方法来进行访问,或者用一种特殊的方式a._A__value(a是对象,A是 ...
- python定义私有变量的方法_Python怎么修改私有属性 如何访问python类中的私有方法...
python 类为什么不能定义私有属性和方法 因为b.name[0] = 'zhang'修改的是类属性,类属性是全局的,所有的实例共享,如果想私有化,可以添加 def __init__( self ) ...
- 4.1.2 私有成员与公有成员
从形式上看,在定义类的成员时,如果成员名以两个下划线(__)开头则表示是私有成员,但是Python并没有对是有成员提供严格访问保护机制.私有成员在类的外部不能直接访问,一般是在类的内部进行访问和操作, ...
- python私有变量什么意思_python为什么有私有方法和变量
1. 访问安全,其实也没有决定的安全 >>> class humer(object): ... def __init__(self, name): ... self.name = n ...
- python协程库_python中协程的详解(附示例)
本篇文章给大家带来的内容是关于python中协程的详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 协程,又称微线程,纤程.英文名Coroutine 协程看上去也是子程序 ...
- python获取局域网在线主机_python通过scapy获取局域网所有主机mac地址示例
python通过scapy获取局域网所有主机mac地址示例 发布于 2014-10-10 20:34:48 | 607 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python ...
- python小数点进位小学数学_python小数的进位与舍去的介绍(附代码)
本篇文章给大家带来的内容是关于python小数的进位与舍去的介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一.基础知识准备 奇进偶舍,又称为四舍六入五成双规则.银行进 ...
- python发送短信内容_Python实现发短信的方法介绍(附代码)
本篇文章给大家带来的内容是关于Python发短信的方法介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. #首先注册互亿无线,然后复制发短信界面右上角的apiid和apik ...
最新文章
- 让烦恼走开 两招让移动硬盘插拔自如
- 团队成员怎样进行工作汇报?
- 监控haproxy的脚本
- base64补等号规则说明
- java web 多语言_基于 Selenium WebDriver 实现多语言环境下自动化截图
- Nginx(二):安装、配置、常用命令
- 苹果和虫子(信息学奥赛一本通-T1038)
- 使用C#开发ActiveX控件
- C++ 抛出和接收异常的顺序
- Linux-iptables初识
- module.exports 与 exports区别
- 删除-驱动人生节能省电方案
- 综治应急指挥中心建设方案
- go语言复数包_复数 | Go语言圣经
- android测试命令,Android Instrument测试命令使用小记
- 如何设置阿里云Web应用攻击防护?
- 灿烂星空,你是真的英雄
- 省社科基金本子评审标准总结
- [Mur-001] Mur源码分析之一
- Vue 官方成员 Hcy:怎么才能有尤雨溪一半强,该怎么学习?