python 封装函数_python:函数数据封装
数据封装
面向对象编程的一个重要特点就是数据封装。在上面的Student类中,每个实例就拥有各自的name和score这些数据。我们可以通过函数来访问这些数据,比如打印一个学生的成绩:
>>> defprint_score(std):
...print('%s: %s' %(std.name, std.score))
...>>>print_score(bart)
Bart Simpson:59
但是,既然Student实例本身就拥有这些数据,要访问这些数据,就没有必要从外面的函数去访问,可以直接在Student类的内部定义访问数据的函数,这样,就把“数据”给封装起来了。这些封装数据的函数是和Student类本身是关联起来的,我们称之为类的方法:
classStudent(object):def __init__(self, name, score):
self.name=name
self.score=scoredefprint_score(self):print('%s: %s' % (self.name, self.score))
要定义一个方法,除了第一个参数是self外,其他和普通函数一样。要调用一个方法,只需要在实例变量上直接调用,除了self不用传递,其他参数正常传入:
>>>bart.print_score()
Bart Simpson:59
这样一来,我们从外部看Student类,就只需要知道,创建实例需要给出name和score,而如何打印,都是在Student类的内部定义的,这些数据和逻辑被“封装”起来了,调用很容易,但却不用知道内部实现的细节。
封装的另一个好处是可以给Student类增加新的方法,比如get_grade:
classStudent(object):
...defget_grade(self):if self.score >= 90:return 'A'
elif self.score >= 60:return 'B'
else:return 'C'
限制访问
在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。
但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的name、score属性:
>>> bart = Student('Bart Simpson', 59)>>>bart.score59
>>> bart.score = 99
>>>bart.score99
如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问,所以,我们把Student类改一改:
classStudent(object):def __init__(self, name, score):
self.__name =name
self.__score =scoredefprint_score(self):print('%s: %s' % (self.__name, self.__score))
改完后,对于外部代码来说,没什么变动,但是已经无法从外部访问实例变量.__name和实例变量.__score了:
>>> bart = Student('Bart Simpson', 59)>>> bart.__nameTraceback (most recent call last):
File"", line 1, in AttributeError:'Student' object has no attribute '__name'
这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮。
但是如果外部代码要获取name和score怎么办?可以给Student类增加get_name和get_score这样的方法:
classStudent(object):
...defget_name(self):return self.__name
defget_score(self):return self.__score
如果又要允许外部代码修改score怎么办?可以再给Student类增加set_score方法:
classStudent(object):
...defset_score(self, score):
self.__score = score
你也许会问,原先那种直接通过bart.score = 99也可以修改啊,为什么要定义一个方法大费周折?因为在方法中,可以对参数做检查,避免传入无效的参数!!!:
classStudent(object):
...defset_score(self, score):if 0 <= score <= 100:
self.__score =scoreelse:raise ValueError('bad score')
python特殊变量__xxxx___:需要注意的是,在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的变量名。
python约定的私有变量_xxxx: 有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。
python私有变量__xxxx开头: 双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,仍然可以通过_Student__name来访问__name变量:
>>>bart._Student__name'Bart Simpson'
但是强烈建议你不要这么干,因为不同版本的Python解释器可能会把__name改成不同的变量名。
总的来说就是,Python本身没有任何机制阻止你干坏事,一切全靠自觉。
最后注意下面的这种错误写法:
>>> bart = Student('Bart Simpson', 59)>>>bart.get_name()'Bart Simpson'
>>> bart.__name = 'New Name' #设置__name变量!
>>> bart.__name
'New Name'
表面上看,外部代码“成功”地设置了__name变量,但实际上这个__name变量和class内部的__name变量不是一个变量!内部的__name变量已经被Python解释器自动改成了_Student__name,而外部代码给bart新增了一个__name变量。不信试试:
>>> bart.get_name() #get_name()内部返回self.__name
'Bart Simpson'
python 封装函数_python:函数数据封装相关推荐
- python返回函数值并退出函数_Python函数的返回值和作用域
函数的返回值和作用域 1.返回值 def guess(x): if x > 3: return "> 3" else: return "<= 3&quo ...
- change在python是什么函数_python函数基础
python函数 函数的基本定义 函数参数 返回值 局部变量和全局变量 嵌套函数 匿名函数 高阶函数 递归 函数的基本定义 引子 现在你的老板让你写一个监控程序,24小时全年午无休的监控你们公司网站服 ...
- python nums函数_Python函数
一.简介 函数是可重用的程序代码块.函数的作用,不仅可以实现代码的复用,更能实现代码的一致性.一致性指的是,只要修改函数的代码,则所有调用该函数的地方都能得到体现. 函数用关键字def来定义,def关 ...
- python not函数_python 函数
1 为什么使用函数 在没有接触函数时,有时候需要将一个功能多次写,如果需要修改其中一个变量,则需要把所有实现该功能的代码一处一处改.不利于代码维护,代码量大了,组织结构也会很不清晰. 所以总结不使用函 ...
- python函数调用位置_python函数定义,调用,传参,位置参数及关键字参数,返回值
使用函数是真正开始编程的第一步,函数y=f(x)我们并不陌生,对x进行一顿操作得到一个值y.给不同的x,进行相同的操作,得到相应的y值. 程序层面函数是执行特定任务的一段代码,将一段代码定义成函数并为 ...
- python函数调用语句_Python函数定义和函数调用
原标题:Python函数定义和函数调用 我们已经使用了一些python内建函数,比如print().input().str()等等. 也使用了一些python自带模块的一些库函数,比如math模块的a ...
- python value函数_python 函数基础
什么是函数? 函数在Python中是最基本的程序结构,用来最大化地让我们的代码进行复用.简单地说,一个函数就是一组Python语句的组合,它们可以在程序中运行一次或多次运行.Python中的函数在其他 ...
- python long函数_python函数
一.函数的优点 使代码模块化 代码复用,减少冗余 保证了代码的一致性 python中的函数分为内置函数和自定义函数 内置函数: 如int(), str(), len(), range(), id(), ...
- python fields函数_Python函数详解
# ------------------------------------一等函数------------------------------------ # 龟叔: 虽然我把函数定为一等对象,但是 ...
最新文章
- (转)如何从storyBoard中加载其中一个controller
- iOS获取webView的内容或修改网页上的内容
- Win7+Ubuntu双系统启动项修复总结
- SAP CRM WebClient UI 培训教程
- 1053. 住房空置率 (20)
- 【漫画】AI小猪的一生
- STM32学习——GPIO的操作
- mysql did not start_mysql 服务无法启动
- Android之PopupWindow弹出对话框
- u-boot之基础知识
- throw er; Unhandled 'error' event Error: listen EADDRINUSE的解决方法
- struts2源码系列(3)--拦截器
- 321. Create Maximum Number
- python的装饰器和find函数的使用
- 基于遗传算法的柔性车间调度优化(Matlab代码实现)
- C语言的结构化程序设计
- 125K非接触IC卡读卡头
- 实现微信扫描小程序码携带参数和路径跳转页面
- 485传感器接入串口交换机采集方案
- Apache Spark 3.0 SQL DataFrame和DataSet指南
热门文章
- javascript小技巧(转)
- 面试官系统精讲Java源码及大厂真题 - 07 List 源码会问哪些面试题
- GitHub开源项目 - Jeecg-Boot开始开发平台介绍
- Spring ORM示例 - 带有AOP事务管理
- input 获取焦点 蓝色边框 去掉 outline
- 【网站】Bing每日壁纸API分享
- 【Python】 数字求和
- 事务处理与事务的隔离级别
- react apollo_2020年的React + Apollo教程(真实示例)
- amazon 使用密码登录_我们通过使用Amazon SageMaker大规模提供机器学习模型学到了什么...