摘自谬雪峰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的类_面向对象编程相关推荐

  1. c语言学生管理系统write to a text file,语言编程学生成绩管理系统.doc

    语言编程学生成绩管理系统 c语言编程-学生成绩管理系统 #include /*引用库函数*/ #include #include #include typedef struct /*定义结构体数组*/ ...

  2. 【Python课程设计】学生成绩管理系统

    [Python课程设计]学生成绩管理系统 1.需求分析 2.功能设计与分析 1.使用数据库对数据进行存取 (1)使用PyMySQL模块操作数据库对数据进行存取 (2)创建数据库school,创建数据表 ...

  3. python成绩管理系统界面-python实现简易版学生成绩管理系统

    300来行python代码实现简易版学生成绩管理系统,供大家参考,具体内容如下 使用链表来实现 class Node(object): def __init__(self, data, pointer ...

  4. 学生成绩管理系统实验报告_学习60天python成果,Python变成学生成绩管理系统

    学习60天python成果,Python变成学生成绩管理系统 大家好,我是一名刚进入大学的python新秀,初次来到博客,希望通过博客想大家分享一下自己的学习成果,并记录自己的在大数据方向的经历,希望 ...

  5. python groupby_用python自动生成全校学生成绩报告

    在高中阶段,学生考试成绩的分析是一个重要的而频繁的应用场景,快速.有效.精准的生成学生成绩的分析报告,是学情监控和开展个性化教学的前提.这个问题是基础性问题,实现的方法非常多,主要是基于Excel.在 ...

  6. python用字典存储学生成绩_掌握Python字典的12个例子

    作者|Soner Yıldırım 编译|VK 来源|Towards Data Science 数据结构是任何编程语言的关键部分.为了创建健壮且性能良好的产品,必须非常了解数据结构. 在这篇文章中,我 ...

  7. Python课程设计:学生成绩管理系统(附源代码)

    版权声明:本文为CSDN博主「大格子嘞」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接: https://blog.csdn.net/qq_43971504 ...

  8. 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+ ...

  9. python的基础网络编程是下列_Python入门基础之网络编程、socket编程、TCP、UDP编程...

    忙了两天,继续更文!希望多多支持. 套接字 套接字是一种具有之前所说的"通讯端点"概念的计算机网络数据结构.网络化的应用程序在开始任何通讯之前都必需要创建套接字. 套接字有三种: ...

最新文章

  1. 首张人类黑洞照片的背后
  2. 成都网络推广告诉大家网站抓取量要如何解决?
  3. 支持向量机(理论+opencv实现)
  4. Echarts柱状图顶部加数量显示
  5. 《看完它面试必solo | 寻找C站宝藏》
  6. 《Python爬虫开发与项目实战》——1.6 小结
  7. gradle 指定springcloud 版本_如何优雅地使用Gradle
  8. 编程习题——Maximum Subarray
  9. Java与C语言混合编程
  10. 修改linux下默认的python版本
  11. C核心技术手册(二十八)
  12. angularjs双向绑定_AngularJS隔离范围双向绑定示例
  13. Linux系统编程 -- 多线程之基于阻塞队列生产者与消费者模型
  14. windows7安装cuda10.2
  15. Stata: 空间计量模型溢出效应的动态呈现
  16. Java之常用类File、IO流的中的字节流、字符流以及缓冲流的学习
  17. [1096]消除ADB错误“more than one device and emulator”的方法
  18. 一个屌丝程序猿的人生(十七)
  19. 【数据可视化应用】Python反距离权重(IDW)插值计算及可视化绘制
  20. 如何在linux CentOS中安装cPanel和WHM

热门文章

  1. 开发有新意的短视频,你就是荣耀王者
  2. PHP把下划线分隔命名的字符串 转换成驼峰式命名方式
  3. 初识tmux---编译安装tmux
  4. centos 防火墙位置
  5. Yii2使用Cookie的注意事项
  6. 手把手教你创建自己的Altium Designer集成元件库
  7. 什么是BGP,BGP的优点有哪些?-Vecloud
  8. 将一张表的数据插入另外一张表
  9. 前端如何高效的与后端协作开发
  10. Unable to connect to the Redgate Client Service