python, 面向对象编程Object Oriented Programming(OOP)
把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。
一:封装(类内的事)
对于类的方法而言,对外只知道功能隐藏细节
假设我们要处理学生的成绩表,为了表示一个学生的成绩,面向过程的程序可以用一个dict表示:
#面向程序 std1 = { 'name': 'Michael', 'score': 98 } std2 = { 'name': 'Bob', 'score': 81 }def print_score(std):print('%s: %s' % (std['name'], std['score']))#面向对象 class Student(object): # 继承类object,所有类最终都会继承的类#属性def __init__(self, name, score):self.name = name self.score = score #数据封装,类的方法,为了和类关联起来def print_score(self): print('%s: %s' % (self.name, self.score)) #封装的另一个好处是可以给Student类增加新的方法def get_grade(self):if self.score >= 90:return 'A'elif self.score >= 60:return 'B'else:return 'C' #给对象发消息就是调用对象对应的关联函数,称为对象的方法,实例bart = Student('Bart Simpson', 59)bart.print_score() #类是创建实例的模板,而实例则是一个一个具体的对象,各个实例拥有的数据都互相独立,互不影响;
访问限制
#属性的名称前加上两个下划线__,私有变量(private),只有内部可以访问 class Student(object):def __init__(self, name, score):self.__name = nameself.__score = scoredef print_score(self):print('%s: %s' % (self.__name, self.__score))#如果外部代码要获取name和score怎么办?可以给Student类增加get_name和get_score这样的方法def get_name(self):return self.__namedef get_score(self):return self.__score#如果又要允许外部代码修改scoredef set_score(self, score):self.__score = score#bart.score = 59也可以修改,因为在方法中,可以对参数做检查,避免传入无效的参数def set_score(self, score):if 0 <= score <= 100:self.__score = scoreelse:raise ValueError('bad score')#变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的#一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的但是约定为私有变量#不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,强烈建议你不要这么干,因为不同版本的Python解释器可能会把__name改成不同的变量名 >>> bart._Student__name 'Bart Simpson'
二:继承(类之间的事)
子类从属父类的属性和方法,也可自己定义,覆盖父类或添加。
当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)
1 class Animal(object): 2 def run(self): 3 print('Animal is running...') 4 5 #继承 6 #对于Dog来说,Animal就是它的父类,对于Animal来说,Dog就是它的子类 7 class Dog(Animal): 8 pass 9 10 class Cat(Animal): 11 pass 12 13 #子类获得了父类的全部功能 14 dog = Dog() 15 dog.run() 16 #结果 17 Animal is running... 18 19 #可以对子类增加一些方法 20 class Dog(Animal): 21 22 def run(self): 23 print('Dog is running...') 24 25 def eat(self): 26 print('Eating meat...') 27 28 #子类和父类都存在相同的run()方法时,子类的run()覆盖了父类的run() 29 dog = Dog() 30 dog.run() 31 #结果,多态 32 Dog is running...
三:多态
定义一个class的时候,实际上就定义了一种数据类型,和Python自带的数据类型,比如str、list、dict没什么两样
1 a = list() # a是list类型 2 b = Animal() # b是Animal类型 3 c = Dog() # c是Dog类型 4 5 #判断一个变量是否是某个类型可以用isinstance() 6 >>> isinstance(a, list) 7 True 8 >>> isinstance(b, Animal) 9 True 10 >>> isinstance(c, Dog) 11 True 12 #个实例的数据类型是某个子类,那它的数据类型也可以被看做是父类 13 >>> isinstance(c, Animal) 14 True 15 #反过来就不行 16 >>> isinstance(b, Dog) 17 False
传入的任意类型,只要是Animal
类或者子类,就会自动调用实际类型的run()
方法
def run_twice(animal):animal.run()animal.run()>>> run_twice(Animal()) Animal is running... Animal is running...>>> run_twice(Dog()) Dog is running... Dog is running...
著名的“开闭”原则:
对扩展开放:允许新增Animal
子类;
对修改封闭:不需要修改依赖Animal
类型的run_twice()
等函数。
静态语言和动态语言
对于静态语言(例如Java)来说,如果需要传入Animal
类型,则传入的对象必须是Animal
类型或者它的子类,否则,将无法调用run()
方法。
对于Python这样的动态语言来说,则不一定需要传入Animal
类型。我们只需要保证传入的对象有一个run()
方法就可以了
这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子
转载于:https://www.cnblogs.com/xiexiaoxiao/p/7047142.html
python, 面向对象编程Object Oriented Programming(OOP)相关推荐
- SystemVerilog HVL:面向对象编程(Object Oriented Programming, OOP)
目录 1. 封装 1.1. 构造函数 new 与句柄 1.2. 调用句柄 1.3. 静态属性 与 静态方法 1.4. 权限(local和protected) 2. 继承 2.1. 子类的构造函数 3. ...
- Python编程基础:第三十九节 面向对象编程Object Oriented Programming
第三十九节 面向对象编程Object Oriented Programming 前言 实践 前言 到目前为止我们都是函数式编程,也即将每一个功能块写为一个函数.其实还有一种更常用的编程方式被称为面向对 ...
- BioPython ② | 面向对象编程Object Oriented Programming
BioPython ② | Python面向对象编程 题目要求 定义分子类(Molecule)作为基类,包含集合elements和weight作为其属性,用初始化函数,将elements初始化为空集, ...
- 面向对象编程 object oriented programming(OOP)
面向对象编程,是一种编程方式,这种编程方式需要使用"对象"来实现 对象的特征 世间万物皆对象 每个对象都是唯一的 对象具有属性和行为(对象的行为包括具有的功能及具体的实现) 对象具 ...
- 面向对象编程 object oriented programming(OOP)(第二篇)
函数装饰器 对于某个函数,如果我们希望在不改变该函数代码的前提下,为该函数增加额外的功能,那么就可以使用装饰器来装饰该函数. 装饰器是一个函数,装饰器接收一个函数作为参数(传入的实参是被装饰的函数) ...
- Java SE 008 理解面向对象程序设计 (Inside Object Oriented Programming)
Java SE 008 理解面向对象程序设计 (Inside Object Oriented Programming) 前言:此笔记为圣思园张龙老师讲述的java视频课程笔记,自己看视频学习时记录的, ...
- Python 面向对象编程基础
Python面向对象编程 简介:面向对象编程--Object Oriented Programming,简称 OOP,是一种程序设计思想.OOP 把对象作为程序的基本单元,一个对象包含了数据和操作数据 ...
- python多个对象调用类方法、且之间有联系_趣味解读Python面向对象编程 (类和对象)...
一.面向对象简介 考虑现实生活中,我们的思维方式是放在学生这个个人上,是学生做了自我介绍.而不是像我们刚刚写出的代码,先有了介绍的行为,再去看介绍了谁. 用我们的现实思维方式该怎么用程序表达呢? 面向 ...
- python3 面向对象编程 下载_Python3(7) Python 面向对象编程
面向对象与面向过程的比较 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. ...
最新文章
- Android 追加写入文件的三种方法
- 【Android基础】趣谈Intent
- vegas pro 15解决导入的视频和音频有噪声问题,亲测可行
- RxJava的初步认识
- 封装汉语自然语言处理中的常用方法(附代码:生成中文词云)
- 【LeetCode笔记】剑指 Offer 14. 剪绳子 I II(Java、动态规划、偏数学)
- 教你用1行Python代码制作动态二维码
- No modules named ‘tensorflow.compat.v2‘
- iOS中利用UISearchBar实现搜索
- mybatis多种方式注册映射文件
- 360 绑架浏览器首页的解决方法
- 【MATLAB】MATLAB 2017A 软件安装
- Springboot毕设项目列车调度信息系统的设计与实现4guf9(java+VUE+Mybatis+Maven+Mysql)
- 30 分钟快速入门 Docker 教程
- 史上最长的介绍BI(商业智能)的干货
- Android中如何利用Minui显示PNG格式的图片
- close函数 qt_QT5笔记:关闭应用程序和窗口的函数
- MYSQL super_read_only 到底有没有必要存在
- SSM实现养老院管理系统
- 老调重弹:JDBC系列之驱动加载原理全面解析)
热门文章
- java获得时间和linux系统时间不一致
- 浏览器根对象window之performance
- python 第13章:面向对象编程
- 理解WebKit和Chromium: Canvas2D及其实现
- Proftpd(MySQL验证+配额)配置
- 周鸿祎:不得不说的话
- python 源代码 macd双底 高 低_MACD指标DIFF双底与双顶:买入与卖出
- python生成范围内随机数_如何使用Python中的pareto分布在specyfic范围内生成随机数...
- 邮件发送类_SpringBoot优雅地发送邮件
- 对于一组给定的叶子结点_高糊图片可以做什么?Goodfellow等人用它生成一组合理图像...