Python面向对象之类的封装操作示例


Posted in Python onJune 08, 2019

本文实例讲述了Python面向对象之类的封装操作。分享给大家供大家参考,具体如下:

承接上一节《Python面向对象之类和实例》,学了Student类的定义及实例化,每个实例都拥有各自的name和score。现在若需要打印一个学生的成绩,可定义函数 print_score()

该函数为类外的函数,如下:

class Student(object):
  def __init__(self, name, score):
    self.name = name
    self.score = score
May = Student("May",90)           # 须要提供两个属性
Peter = Student("Peter",85)
print(May.name, May.score)
print(Peter.name, Peter.score)
def print_score(Student):          # 外部函数print_score(Student)
  # print("%s's score is: %d" %(Student.name,Student.score))       # 普通 print 写法
  print("{0}'s score is: {1}".format(Student.name,Student.score))    # 建议使用 Python 2.7 + .format优化写法
print_score(May)
print_score(Peter)

既然Student实例本身就拥有这些数据,要访问这些数据,就没有必要从外面的函数去访问,我们可以直接在Student类的内部定义访问数据的函数。这样,就把数据给“封装”起来了。

“封装”就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体(即类);封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的访问权限来使用类的成员。

而这些封装数据的函数是和Student类本身是关联起来的,我们称之为类的方法。那如何定义类的方法呢?

就要用到对象 self 本身,参考上例,把 print_score() 函数写为类的方法(Python2.7之后的版本,推荐.format 输出写法):

class Student(object):
  def __init__(self, name, score):
    self.name = name
    self.score = score
  def print_score(self):
    print("{self.name}'s score is: {self.score}".format(self=self))    # Python 2.7 + .format优化写法
May = Student("May",90)
Peter = Student("Peter",85)

定义类的方法:除了第一个参数是self外,其他和普通函数一样。

实例调用方法:只需要在实例变量上直接调用,除了self不用传递,其他参数正常传入;注意,若类的方法仅需要self,不需要其他,调用该方法时,仅需 instance_name.function_name()

这样一来,我们从外部看Student类,就只需要知道,创建实例需要给出name和score,而如何打印,都是在Student类的内部定义的,这些数据和逻辑被“封装”起来了,调用很容易,但却不用知道内部实现的细节。

封装的另一个好处是可以给Student类增加新的方法;这边的方法也可以要求传参,如新增定义compare 函数,如下:

class Student(object):
  def __init__(self, name, score):
    self.name = name
    self.score = score
  def print_score(self):
    print("{self.name}'s score is: {self.score}".format(self=self))    # Python 2.7 + .format优化写法
  def compare(self,s):
    if self.score>s:
      print("better than %d" %(s))
    elif self.score==s:
      print("equal %d" %(s))
    else:
      print("lower than %d" %(s))
May = Student("May",90)
Peter = Student("Peter",85)
May.print_score()
Peter.print_score()
May.compare(100)
May.compare(90)
May.compare(89)

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python处理大数字的方法
May 27 Python
Django自定义分页效果
Jun 27 Python
Python 3.6 读取并操作文件内容的实例
Apr 23 Python
对python中的logger模块全面讲解
Apr 28 Python
获取python的list中含有重复值的index方法
Jun 27 Python
python 借助numpy保存数据为csv格式的实现方法
Jul 04 Python
Django 登陆验证码和中间件的实现
Aug 17 Python
django框架基于模板 生成 excel(xls) 文件操作示例
Jun 19 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
May 03 Python
Python基于jieba, wordcloud库生成中文词云
May 13 Python
python编写函数注意事项总结
Mar 29 Python
Elasticsearch 批量操作
Apr 19 Python
Python面向对象之类和实例用法分析
Jun 08 #Python
Python学习笔记之自定义函数用法详解
Jun 08 #Python
Python3基础教程之递归函数简单示例
Jun 07 #Python
Python正则表达式匹配和提取IP地址
Jun 06 #Python
Python 常用模块 re 使用方法详解
Jun 06 #Python
Python比较配置文件的方法实例详解
Jun 06 #Python
Django中使用 Closure Table 储存无限分级数据
Jun 06 #Python
You might like
WINDOWS服务器安装多套PHP的另类解决方案
2006/10/09 PHP
Wordpress php 分页代码
2009/10/21 PHP
PHP 多维数组的排序问题 根据二维数组中某个项排序
2011/11/09 PHP
php中长文章分页显示实现代码
2012/09/29 PHP
探讨PHP中OO之静态关键字以及类常量的详解
2013/06/07 PHP
ThinkPHP独立分组使用的注意事项
2014/11/25 PHP
PHP中把对象转换为关联数组代码分享
2015/04/09 PHP
100行PHP代码实现socks5代理服务器
2016/04/28 PHP
php中的抽象方法和抽象类
2017/02/14 PHP
laravel使用Faker数据填充的实现方法
2019/04/12 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
Domino中运用jQuery读取视图内容的方法
2009/10/21 Javascript
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
2011/04/01 Javascript
jQuery filter函数使用方法
2014/05/19 Javascript
浅谈jQuery页面的滚动位置scrollTop、scrollLeft
2015/05/19 Javascript
基于javascript实现仿百度输入框自动匹配功能
2016/01/03 Javascript
Web前端开发之水印、图片验证码
2016/11/27 Javascript
Jquery删除css属性的简单方法
2016/12/04 Javascript
Javascript实现倒计时时差效果
2017/05/18 Javascript
vue项目中,main.js,App.vue,index.html的调用方法
2018/09/20 Javascript
pandas 按照特定顺序输出的实现代码
2018/07/10 Python
利用Python如何制作好玩的GIF动图详解
2018/07/11 Python
Python程序包的构建和发布过程示例详解
2019/06/09 Python
Django用户认证系统 User对象解析
2019/08/02 Python
python读写文件write和flush的实现方式
2020/02/21 Python
HTML5 Canvas的常用线条属性值总结
2016/03/17 HTML / CSS
html2canvas生成的图片偏移不完整的解决方法
2020/05/19 HTML / CSS
英国马莎百货官网:Marks & Spencer
2016/07/29 全球购物
施华洛世奇水晶荷兰官方网站:SWAROVSKI荷兰
2017/05/12 全球购物
秋季运动会通讯稿
2014/01/24 职场文书
先进班集体事迹材料
2014/12/25 职场文书
MySQL update set 和 and的区别
2021/05/08 MySQL
Python中OpenCV实现查找轮廓的实例
2021/06/08 Python
前端vue+express实现文件的上传下载示例
2022/02/18 Vue.js
PostgreSQL常用字符串分割函数整理汇总
2022/07/07 PostgreSQL
JDK8中String的intern()方法实例详细解读
2022/09/23 Java/Android