数据封装

面向对象编程的一个重要特点就是数据封装。在上面的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:函数数据封装相关推荐

  1. python返回函数值并退出函数_Python函数的返回值和作用域

    函数的返回值和作用域 1.返回值 def guess(x): if x > 3: return "> 3" else: return "<= 3&quo ...

  2. change在python是什么函数_python函数基础

    python函数 函数的基本定义 函数参数 返回值 局部变量和全局变量 嵌套函数 匿名函数 高阶函数 递归 函数的基本定义 引子 现在你的老板让你写一个监控程序,24小时全年午无休的监控你们公司网站服 ...

  3. python nums函数_Python函数

    一.简介 函数是可重用的程序代码块.函数的作用,不仅可以实现代码的复用,更能实现代码的一致性.一致性指的是,只要修改函数的代码,则所有调用该函数的地方都能得到体现. 函数用关键字def来定义,def关 ...

  4. python not函数_python 函数

    1 为什么使用函数 在没有接触函数时,有时候需要将一个功能多次写,如果需要修改其中一个变量,则需要把所有实现该功能的代码一处一处改.不利于代码维护,代码量大了,组织结构也会很不清晰. 所以总结不使用函 ...

  5. python函数调用位置_python函数定义,调用,传参,位置参数及关键字参数,返回值

    使用函数是真正开始编程的第一步,函数y=f(x)我们并不陌生,对x进行一顿操作得到一个值y.给不同的x,进行相同的操作,得到相应的y值. 程序层面函数是执行特定任务的一段代码,将一段代码定义成函数并为 ...

  6. python函数调用语句_Python函数定义和函数调用

    原标题:Python函数定义和函数调用 我们已经使用了一些python内建函数,比如print().input().str()等等. 也使用了一些python自带模块的一些库函数,比如math模块的a ...

  7. python value函数_python 函数基础

    什么是函数? 函数在Python中是最基本的程序结构,用来最大化地让我们的代码进行复用.简单地说,一个函数就是一组Python语句的组合,它们可以在程序中运行一次或多次运行.Python中的函数在其他 ...

  8. python long函数_python函数

    一.函数的优点 使代码模块化 代码复用,减少冗余 保证了代码的一致性 python中的函数分为内置函数和自定义函数 内置函数: 如int(), str(), len(), range(), id(), ...

  9. python fields函数_Python函数详解

    # ------------------------------------一等函数------------------------------------ # 龟叔: 虽然我把函数定为一等对象,但是 ...

最新文章

  1. (转)如何从storyBoard中加载其中一个controller
  2. iOS获取webView的内容或修改网页上的内容
  3. Win7+Ubuntu双系统启动项修复总结
  4. SAP CRM WebClient UI 培训教程
  5. 1053. 住房空置率 (20)
  6. 【漫画】AI小猪的一生
  7. STM32学习——GPIO的操作
  8. mysql did not start_mysql 服务无法启动
  9. Android之PopupWindow弹出对话框
  10. u-boot之基础知识
  11. throw er; Unhandled 'error' event Error: listen EADDRINUSE的解决方法
  12. struts2源码系列(3)--拦截器
  13. 321. Create Maximum Number
  14. python的装饰器和find函数的使用
  15. 基于遗传算法的柔性车间调度优化(Matlab代码实现)
  16. C语言的结构化程序设计
  17. 125K非接触IC卡读卡头
  18. 实现微信扫描小程序码携带参数和路径跳转页面
  19. 485传感器接入串口交换机采集方案
  20. Apache Spark 3.0 SQL DataFrame和DataSet指南

热门文章

  1. javascript小技巧(转)
  2. 面试官系统精讲Java源码及大厂真题 - 07 List 源码会问哪些面试题
  3. GitHub开源项目 - Jeecg-Boot开始开发平台介绍
  4. Spring ORM示例 - 带有AOP事务管理
  5. input 获取焦点 蓝色边框 去掉 outline
  6. 【网站】Bing每日壁纸API分享
  7. 【Python】 数字求和
  8. 事务处理与事务的隔离级别
  9. react apollo_2020年的React + Apollo教程(真实示例)
  10. amazon 使用密码登录_我们通过使用Amazon SageMaker大规模提供机器学习模型学到了什么...