Python学习(七)面向对象 ——封装

Python 类的封装

 

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

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

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

 

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

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

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

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

 1 class Student(object):
 2     def __init__(self, name, score): 
 3         self.name = name
 4         self.score = score
 5 
 6     def print_score(self):
 7         print("{self.name}'s score is: {self.score}".format(self=self))        # Python 2.7 + .format优化写法
 8         
 9 May = Student("May",90)        
10 Peter = Student("Peter",85)        

 

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

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

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

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

 1 class Student(object):
 2     def __init__(self, name, score): 
 3         self.name = name
 4         self.score = score
 5 
 6     def print_score(self):
 7         print("{self.name}'s score is: {self.score}".format(self=self))        # Python 2.7 + .format优化写法
 8         
 9     def compare(self,s):
10         if self.score>s:
11             print("better than %d" %(s))
12         elif self.score==s:
13             print("equal %d" %(s))
14         else:
15             print("lower than %d" %(s))
16 
17 May = Student("May",90)        
18 Peter = Student("Peter",85)        
19 
20 May.print_score()
21 Peter.print_score()
22 
23 May.compare(100)
24 May.compare(90)
25 May.compare(89)

 

转载于:https://www.cnblogs.com/feeland/p/4415645.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259087.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spss练习数据_SPSS篇——如何在成千上百万个数据中标识重复个案

本文就带大家来学习一个小技巧,如何运用SPSS标识重复个案。我们都知道在Excel中,通常会用到“筛选”功能来选出指定条件相同的单元格。那么在SPSS中,如何在成千上百万个数据中筛选出重复的个案呢? 小编就是要告诉你,几…

DOxygen for C++使用说明——Markdown支持

自Doxygen 版本1.8.0,Markdown被引进。 接下来,我们将先简单介绍标准的Markdown语法,读者可以进入Markdown官网查询更详细的细节。然后讨论一下Doxygen支持的Markdown扩展,最后讨论一下Doxygen对Markdown标准的实现细节。 Stand…

方程式漏洞之复现window2008/win7 远程命令执行漏洞

前几天就想写的,因为一些缘故就没写。此次是在外网环境下进行的。大家在内网中也一个样。 方法: 使用Eternalblue模块,剑测是否有漏洞然后msf生成一个dll直接反弹shell. PS:win版本的不知道缘何生成出来的dll是0kb 我就在自己本地…

C++空类和string类

1. 空类 1.1 空类默认哪六个成员函数。 1 class Empty2 {3 public:4 Empty(); //缺省构造函数 Empty e;5 Empty( const Empty& ); //拷贝构造函数 Empty e2(e1);6 ~Empty(); //析构函数7 Empty& operator( const Empty& ); //赋值运算符…

客服会话 小程序 如何发起_小程序、公众号、App三者如何融合布局?这里有一份避坑指南...

对产品经理来说,小程序无疑是2020年最火爆的词之一了。我们能看到,就在今年疫情期间,小程序DAU达到4.5亿,而超市、生鲜果蔬、社区购物等都同比增长100个点左右,小程序的商业价值很明显地在快速释放。小程序如此火爆&am…

DOxygen for C++使用说明——注释代码二

这一次我在谷歌搜索中检索到了Doxygen在github的仓库,进去一看,令人大喜,github仓库里含有了一个Doxygen的官方配置文件Doxyfile,于是下载下来,发现Doxyfile已经配置了将仓库中的\src文件编译成Documentation,并且将结果放在了dox…

python super()(转载)

一、问题的发现与提出 在Python类的方法(method)中,要调用父类的某个方法,在Python 2.2以前,通常的写法如代码段1: 代码段1: class A:def __init__(self):print "enter A"print "…

Swagger+Spring mvc生成Restful接口文档

2019独角兽企业重金招聘Python工程师标准>>> Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端…

JavaScript——变量与基本数据类型

前言 JavaScript中的变量为松散类型,所谓松散类型就是指当一个变量被申明出来就可以保存任意类型的值,就是不像SQL一样申明某个键值为int就只能保存整型数值,申明varchar只能保存字符串。一个变量所保存值的类型也可以改变,这在Ja…

vscode可以打开jupyternotebook吗_刚刚,官方宣布 VS Code 支持 Python 全开发了!

关注Python高校每天早上23:10准时推送北京时间 2019 年 9 月 21 日,PyCon China 2019 在上海举行。在下午的演讲中,来自微软开发工具事业部的资深研发工程师韩骏做了主题为《Python 与 Visual Studio Code 在人工智能应用中的最佳 Azure 实践》的演讲。在…

C++类的内联成员函数应放在哪

今天复习C Primer的时候,看到了关于C类的内联成员函数的放置,应该放在头文件中。那么这到底是为什么 呢?仅仅是一种代码规范问题还是必须这样做呢? 下面我就来讲讲我自己的理解吧。要彻底理解这个问题,首先就要了解下函…

python selenium自动化(三)Chrome Webdriver的兼容

当一个自动化测试被实现在一个浏览器之后,我们会希望我们的测试能够覆盖到尽量多的别的浏览器。通过跨平台的测试来保证我们的程序在多个浏览器下都能正常工作。 在安装了selenium之后,firefox webdriver和IE webdriver就已经是ready to use的了&#xf…

NDK 编译armebai-v7a的非4字节对齐crash Fatal signal 7 (SIGSEGV) 错误解决

一直都是编译armabi的。没有不论什么问题,这个架构是软件模拟浮点运算的。后来看到NDK文档上说armabi-v7a是针对有硬件处理浮点计算的arm cpu的。 于是就改动配置编译armebai-v7a的so文件。 结果是编译没问题。一执行就是crash掉,Fatal signal 7 (SIGSEG…

作业三

作业三 第一章问题:书上写的“Bug的多少可以直接衡量一个软件的开发效率、用户满意度、可靠性和可维护性”,那么一个比较完好的软件中一般大概会出现多少Bug? 第二章问题:现在开始训练写更多的程序能否更早地达到软件工程师的标准&#xff1…

springboot默认数据源如何设置连接数_Spring Boot系列之配置数据库连接池

在实际的应用开发中,与数据库交互通常使用数据库连接池来重用Connection对象,减少资源消耗。Spring Boot 的数据源是自动配置的。在 Spring Boot 2.2.1 版本中,有几种数据源配置可选,它们按照 HikariCP -> Tomcat -> DBCP2 …

使用Qt正则表达式提取全路径的文件名

问题描述: 给定三个全路径,例如 path1"C:/Users/asus/Desktop/nefertiti_4465.obj"; path2"C:/Users/asus/Desktop/nefertiti_4465_k1.txt"; path3"C:/Users/asus/Desktop/nefertiti_4465_k2.txt"; 我希望说明path2和pa…

Beyond Compare 3.3.8 build 16340 + Key

本文摘录自冰点社区:http://forum.z27315.com/topic/14746-beyond-compare-338-build-16340-key/ Download Beyond Compare 3 Current Version: 3.3.8, build 16340, released June 19, 2013 Windows 版本 Windows Standard and Pro EditionsEnglish version 5800k…

hdu 1198 Farm Irrigation

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid1198 题目大意: 有一大块土地需要浇水,这块土地由很多的小块土地(有十一种)组成,小块土地上有水沟,问至少需要建几个井,才能灌…

strcpy_s、sptintf_s与strcat_s的使用

strcpy_s、sptintf_s与strcat_s是strcpy、sptintf与strcat的安全版本,均是通过指定缓冲区长度来避免存在的溢出风险。 strcpy_s 与strcpy strcpy_s和strcpy函数的功能几乎是一样的。strcpy函数,就象gets函数一样,它没有方法来保证有效的缓冲…

小米一键上锁工具_小米首款高端全自动智能锁火热预售中,一触开启全自动时代...

近些年,随着科技的发展,人工智能逐渐走入大众视野。人类社会也正从信息时代向“智能时代”过渡,在整个过程中智能家居领域的蓬勃发展可谓当仁不让,一直备受用户瞩目。智能锁作为家的第一道守护防线,家庭物联网入口的关…