本节重点

  • 了解面向对象、面向过程的区别

  • 掌握什么是类,什么是对象

  • 掌握如何定义及使用类和对象

  • 了解类与对象间的关系

  • 掌握类属性和实例属性

  • 掌握绑定方法

一.编程范式

​    ​编程即写程序or写代码,具体是指程序员用特定的方法+数据结构+算法编写代码,目的是用来告诉计算机如何执行任务。

​如果把编程的过程比喻为练习武功,那么编程范式值的就是武林中的各种流派,而在编程的世界里最常见的两大流派就是:面向过程和面向对象。

​“功夫”的流派没有高低之分,只有习武的人才有高低之分,在编程世界里更是这样,面向过程与面向对象在不同的场景下都各有优劣,谁好谁坏不能一概而论,下面就让我们来详细了解它们。

二.面向过程设计

​    ​面向过程:核心是“过程”二字,“过程”指的是解决问题的步骤,即先干什么...再干什么......,基于面向过程设计程序就好比在设计一条流水线,是一种机械式的思维方式。若程序一开始是要着手解决一个大的问题,面向过程的基本设计思路就是把这个大的问题分解成很多歌小问题或子过程,这些子过程在执行的过程中继续分解,直到小问题足够见到到可以在一个小步骤范围内解决。

优点是:复杂的问题流程化,进而简单化(一个复杂的问题,分成一个个小的步骤去实现,实现小的步骤将会非常简单)

缺点是:一套流水线或者流程就是用来解决一个问题,比如生产契税的流水线无法生产汽车,即便是能,也得大改,改一个组件,与其相关的组件都要修改,牵一发而动全身,扩展性极差。

应用场景:面向过程的程序设计思想一般用于那些功能一旦实现之后就很少需要改变的场景,如果你知识写一些简单的脚本,去做一些一次性任务,用面向过程的方式是极好的,著名的例子有Linux内核,git,以及Apache Http Server等。但如果你要处理的任务是复杂的,且需要不断迭代和维护的,那还是用面向对象更方便了。

三.面向对象设计

面向对象:核心是“对象”二字,要理解对象为何物,必须把自己当成上帝,在上帝眼里,世间存在的万物皆为对象,不存在的也可以创造出来。基于面向对象设计程序就好比在创造一个世界,世界是由一个个对象组成,而你就是创造对象的上帝。

​    ​    ​    ​    ​与面向过程机械式的思维方式形成鲜明对比,面向对象更加注重对现实世界的而非流程的模拟,是一种“上帝式”的思维方式。

优点是:解决了面型过程可扩展性低的问题。需要强调的是,对于一个软件质量来说,面向对象的程序设计并不代表全部,面向对象的程序设计只是用来解决扩展性问题。

缺点是:编程的复杂度远高于面向过程,不了解面向对象而立即上手并基于它涉及程序,极容易出现过度设计的问题,而且在一些扩展性要求低的场景使用面向对象会徒增编程难度,比如管理linux系统的shell脚本程序就不适合面向对象去设计,面向过程反而更加适合。

应用场景:当然是应用于需求经常变化的软件中,一般需求的变化都几种在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方。

四.类与对象

1.类与对象概念

​类即类别、种类,是面向对象设计最重要的概念。对象是特征和技能的结合体,而类则使一系列对象相似的特征和技能的结合体。

​在现实生活中:先有对象,再有类

​再程序总:先定义类,后产生对象

​2.定义类

class School:
name = 'qinghua'
def learn(self):
print('is learning')
def eat(self):
print('is eating')
def sleep(self):
print('is sleeping')

​注意

    • 类中可以有任意python代码,这些代码在勒定义阶段便会执行,因而会产生新的名称空间,用来存放类的变量名和函数名,可以通过School.__dict__ ​查看

    • 类中定义的名字,都是类的属性,点事访问属性的语法

    • 对于经典类来说我们可以通过该字典操作类名称空间的名字,但新式类有限制(新式类与经典类的区别我们将在后续章节介绍)

五.类属性和实例属性

​类属性:School.name

​实例属性:s = School()

​    ​    ​    ​    ​ s.addr = '北京'

六.属性查找与绑定方法

​1.属性查找

​类的数据属性是所有对象共享的

​类的函数数据是绑定给对象使用的,称为绑定到对象的方法

​2.绑定方法

​    ​类中定义的函数(没有被任何装饰器装饰的)是类的函数属性,类可以使用,但是必须遵循函数的使用规则,有几个参数就传几个参数。

class School:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex =sex def learn(self):
print('%s is learning') s1 = School('清华',18,'男')
School.learn(s1)
s1.learn()

​类中定义的函数(没有别任何装饰器装饰的),其实主要是给对象使用的,而且是绑定到对象的,虽然所有对象指向的都是相同的功能,但是绑定到不同的对象时其实是不同的方法。

​强调:绑定到对象的方法的特殊之处在于,绑定给谁就由谁来调用,谁来调用,就会将‘谁’本身当做第一个参数传给方法,即自动传值(方法__init__也是一样的道理)

​s1.learn() # 等同于School.learn(s1)

python学习之路 八 :面向对象编程基础的更多相关文章

  1. Python学习-第三天-面向对象编程基础

    Python学习-第三天-面向对象编程基础 类和对象 简单的说,类是对象的蓝图和模板,而对象是类的实例.这个解释虽然有点像用概念在解释概念,但是从这句话我们至少可以看出,类是抽象的概念,而对象是具体的 ...

  2. Python学习之路——类-面向对象编程

    类 面向对象编程 通过类获取一个对象的过程 - 实例化 类名()会自动调用类中的__init__方法 类和对象之间的关系? 类 是一个大范围 是一个模子 它约束了事务有哪些属性 但是不能约束具体的值 ...

  3. Python学习之路9☞面向对象的程序设计

    一 面向对象的程序设计的由来 见概述:http://www.cnblogs.com/linhaifeng/articles/6428835.html 二 什么是面向对象的程序设计及为什么要有它 面向过 ...

  4. python学习笔记15(面向对象编程)

    虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程. 一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界 ...

  5. Python学习札记(三十) 面向对象编程 Object Oriented Program 1

    参考:OOP NOTE 1.面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. ...

  6. Python学习之路15☞socket编程

    一 客户端/服务器架构 即C/S架构,包括 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二 os ...

  7. Python学习之路10☞面向对象进阶

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 class Foo(objec ...

  8. python学习之路-8 面向对象之进阶

    上篇内容回顾和补充 面向对象三大特性 封装 继承 多态 在python中没有多态的概念 变量的类型允许为多种数据类型称之为多态 # c#/java中的多态 # 伪代码 def func(int arg ...

  9. Python学习笔记四:面向对象编程

    一:定义类并创建实例 Python中定义类,通过class关键字,类名开头大写,参数列表为所继承的父类.如果没有需要明确继承的类,则继承object. 使用类来创建对象,只需 类名+() 形式即可,p ...

随机推荐

  1. PHP - declare tick

    今天看php手册,结构流程控制语句,翻到个没见过的关键字declare(申明的意思).于是稍稍看了下. 大概意思是:定义一段代码.关于他合适执行,怎么执行完全依照他的参数. 反正不知道什么意思.先来一 ...

  2. 将本地Jar包安装到maven仓库中去

    开发中会遇到无法通过pom.xml下载jar包的情况,遇到这种情况我们可以手动在本地安装jar包到本地仓库中去,这样就可以下次再用到的话不用再次联网下载,具体以oracle的驱动包ojdbc6.jar ...

  3. tomcat https

    转自 http://11lingxian.iteye.com/blog/1491607 双向认证: 客户端向服务器发送消息,首先把消息用客户端证书加密然后连同时把客户端证书一起发送到服务器端, 服务器 ...

  4. DVI与VGA有什么区别

    [DVI与VGA有什么区别] DVI接口的传输信号采用全数字格式,与之对应的是采用模拟信号的VGA接口. VGA和DVI的区别,首先VGA模拟信号的传输比较麻烦,首先是将电脑内的数字信号转换为模拟信号 ...

  5. Spark之 RDD

    简介 RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素可并行计算的集合. Resilien ...

  6. Python Beautiful Soup 解析库的使用

    Beautiful Soup 借助网页的结构和属性等特性来解析网页,这样就可以省去复杂的正则表达式的编写. Beautiful Soup是Python的一个HTML或XML的解析库. 1.解析器 解析 ...

  7. Maven01 环境准备、maven项目结构、编译/测试/打包/清除、安装、

    0 前提准备 0.1 安装java开发环境 0.2 安装maven工具 1 maven项目基本结构 如图所示,整个maven项目有业务文件.测试文件.POM依赖管理文件:其实还有一个资源文件resou ...

  8. Qt自定义插件编程小结

    qt自定义组件开发步骤演示.以下所有步骤的前提是自己先编译Qtcreator源码,最好生成release版的QtCreator,否则自定义的插件嵌入QtCreator会失败!!!(这个网上教程很多) ...

  9. c#反射泛型方法

    private void GetByEnumType() { var EnumType = Context.Request["EnumType"] ?? ""; ...

  10. java GC机制(转)

    http://blog.csdn.net/zsuguangh/article/details/6429592 1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之 ...