python的面向对象编程学生成绩_python的类_面向对象编程
摘自谬雪峰https://www.liaoxuefeng.com/wiki/1016959663602400/1017496031185408
面向对象编程(定义对象)和面向过程(定义函数)的区别,各自优缺点:
面向对象编程的一个重要特点就是数据封装,在上面的Student类中,每个实例就拥有各自的name和score这些数据。我们可以通过函数来访问这些数据,比如打印一个学生的成绩:
>>> def print_score(std):
... print('%s: %s' % (std.name, std.score))
...
>>> print_score(bart)
Bart Simpson: 59
但是,既然Student实例本身就拥有这些数据,要访问这些数据,就没有必要从外面的函数去访问,可以直接在Student类的内部定义访问数据的函数,这样,就把“数据”给封装起来了。这些封装数据的函数是和Student类本身是关联起来的,我们称之为类的方法:
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))
这样一来,我们从外部看Student类,就只需要知道,创建实例需要给出name和score,而如何打印,都是在Student类的内部定义的,这些数据和逻辑被“封装”起来了,调用很容易,但却不用知道内部实现的细节。
小结
类是创建实例的模板,而实例则是一个一个具体的对象,各个实例拥有的数据都互相独立,互不影响;
方法就是与实例绑定的函数,和普通函数不同,方法可以直接访问实例的数据;
通过在实例上调用方法,我们就直接操作了对象内部的数据,但无需知道方法内部的实现细节。
类的私有变量
两个下划线开头的变量是私有变量,再外部不能直接访问,但是,有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。
双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,仍然可以通过_Student__name来访问__name变量:
>>> bart._Student__name
'Bart Simpson'
但是强烈建议你不要这么干,因为不同版本的Python解释器可能会把__name改成不同的变量名。
总的来说就是,Python本身没有任何机制阻止你干坏事,一切全靠自觉。
类的继承的多态性
要理解什么是多态,我们首先要对数据类型再作一点说明。当我们定义一个class的时候,我们实际上就定义了一种数据类型。我们定义的数据类型和Python自带的数据类型,比如str、list、dict没什么两样:
a = list() # a是list类型
b = Animal() # b是Animal类型
c = Dog() # c是Dog类型
判断一个变量是否是某个类型可以用isinstance()判断:
>>> isinstance(a, list)
True
>>> isinstance(b, Animal)
True
>>> isinstance(c, Dog)
True
什么是多态?多态的优点
多态的好处就是,当我们需要传入Dog、Cat、Tortoise……时,我们只需要接收Animal类型就可以了,因为Dog、Cat、Tortoise……都是Animal类型,然后,按照Animal类型进行操作即可。由于Animal类型有run()方法,因此,传入的任意类型,只要是Animal类或者子类,就会自动调用实际类型的run()方法,这就是多态的意思:
对于一个变量,我们只需要知道它是Animal类型,无需确切地知道它的子类型,就可以放心地调用run()方法,而具体调用的run()方法是作用在Animal、Dog、Cat还是Tortoise对象上,由运行时该对象的确切类型决定,这就是多态真正的威力:调用方只管调用,不管细节,而当我们新增一种Animal的子类时,只要确保run()方法编写正确,不用管原来的代码是如何调用的。这就是著名的“开闭”原则:
对扩展开放:允许新增Animal子类;
对修改封闭:不需要修改依赖Animal类型的run_twice()等函数。
python的面向对象编程学生成绩_python的类_面向对象编程相关推荐
- c语言学生管理系统write to a text file,语言编程学生成绩管理系统.doc
语言编程学生成绩管理系统 c语言编程-学生成绩管理系统 #include /*引用库函数*/ #include #include #include typedef struct /*定义结构体数组*/ ...
- 【Python课程设计】学生成绩管理系统
[Python课程设计]学生成绩管理系统 1.需求分析 2.功能设计与分析 1.使用数据库对数据进行存取 (1)使用PyMySQL模块操作数据库对数据进行存取 (2)创建数据库school,创建数据表 ...
- python成绩管理系统界面-python实现简易版学生成绩管理系统
300来行python代码实现简易版学生成绩管理系统,供大家参考,具体内容如下 使用链表来实现 class Node(object): def __init__(self, data, pointer ...
- 学生成绩管理系统实验报告_学习60天python成果,Python变成学生成绩管理系统
学习60天python成果,Python变成学生成绩管理系统 大家好,我是一名刚进入大学的python新秀,初次来到博客,希望通过博客想大家分享一下自己的学习成果,并记录自己的在大数据方向的经历,希望 ...
- python groupby_用python自动生成全校学生成绩报告
在高中阶段,学生考试成绩的分析是一个重要的而频繁的应用场景,快速.有效.精准的生成学生成绩的分析报告,是学情监控和开展个性化教学的前提.这个问题是基础性问题,实现的方法非常多,主要是基于Excel.在 ...
- python用字典存储学生成绩_掌握Python字典的12个例子
作者|Soner Yıldırım 编译|VK 来源|Towards Data Science 数据结构是任何编程语言的关键部分.为了创建健壮且性能良好的产品,必须非常了解数据结构. 在这篇文章中,我 ...
- Python课程设计:学生成绩管理系统(附源代码)
版权声明:本文为CSDN博主「大格子嘞」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接: https://blog.csdn.net/qq_43971504 ...
- python版本不同影响大不大_Python的不同版本对编程有影响吗
z=x x=y y=z A.10,20,30 B.10,20,20 C.20,10,10 D.20,10,30 有一个函数关系如下所示: xyx<0x x=0xx>0x+ ...
- python的基础网络编程是下列_Python入门基础之网络编程、socket编程、TCP、UDP编程...
忙了两天,继续更文!希望多多支持. 套接字 套接字是一种具有之前所说的"通讯端点"概念的计算机网络数据结构.网络化的应用程序在开始任何通讯之前都必需要创建套接字. 套接字有三种: ...
最新文章
- 首张人类黑洞照片的背后
- 成都网络推广告诉大家网站抓取量要如何解决?
- 支持向量机(理论+opencv实现)
- Echarts柱状图顶部加数量显示
- 《看完它面试必solo | 寻找C站宝藏》
- 《Python爬虫开发与项目实战》——1.6 小结
- gradle 指定springcloud 版本_如何优雅地使用Gradle
- 编程习题——Maximum Subarray
- Java与C语言混合编程
- 修改linux下默认的python版本
- C核心技术手册(二十八)
- angularjs双向绑定_AngularJS隔离范围双向绑定示例
- Linux系统编程 -- 多线程之基于阻塞队列生产者与消费者模型
- windows7安装cuda10.2
- Stata: 空间计量模型溢出效应的动态呈现
- Java之常用类File、IO流的中的字节流、字符流以及缓冲流的学习
- [1096]消除ADB错误“more than one device and emulator”的方法
- 一个屌丝程序猿的人生(十七)
- 【数据可视化应用】Python反距离权重(IDW)插值计算及可视化绘制
- 如何在linux CentOS中安装cPanel和WHM