Python面向对象编程

面向过程 VS 面向对象

面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。

优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可。

缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身。

应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等。

OOP:面向对象是英文Object Oriented Programming的缩写,面向对象的程序设计的核心是对象(上帝式思维)

面向对象的程序设计的

优点是:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。

缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题即便是上帝也无法预测最终结果。于是我们经常看到一个游戏人某一参数的修改极有可能导致阴霸的技能出现,一刀砍死3个人,这个游戏就失去平衡。

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

在python 中面向对象的程序设计并不是全部。

面向对象编程可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率 ,另外,基于面向对象的程序可以使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容

了解一些名词:类、对象、实例、实例化

类:具有相同特征的一类事物(人、猫、狮子)

对象/实例:具体的某一个事物(隔壁老王、Tom)

实例化:类—>对象的过程(这在生活中表现的不明显,我们在后面再慢慢解释)

创建类和对象

面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。

类就是一个模板,模板里可以包含多个函数,函数里实现一些功能

对象则是根据模板创建的实例,通过实例对象可以执行类中的函数

• class是关键字,表示类

• 创建对象,类名称后加括号即可

面向对象的三大特性

(1)继承

(2)多态

(3)封装


(1)继承与派生

继承, 面向对象中的继承就是继承的类直接拥有被继承类的属性而不需要在自己的类体中重新再写一遍,其中被继承的类叫做父类、基类,继承的类叫做派生类、子类。在python3中如果不指定继承哪个类,默认就会继承Object类,而继承了Object类的类就叫做新式类,而在python2中如果不指定继承哪个类也不会默认去继承Object类,而没有继承Object类的类就叫做经典类。经典类和新式类的不同就在于对方法的搜索顺序不同,经典类是深度优先即先找自己类内,如果没有就找左边第一个父类,没找到继续从这个父类的父类中找依次类推直到找到最上一级的父类也没找到再找左边第二个父类,然后再重复之前的过程,直到所有父类找一遍没找到就报错;而新式类是广度优先,当下一个类可以通过其他类找到时就先不去找它,而是找继承关系中与它的子类同级的其他类,依次类推直到最后找到object类没有找到指定方法就报错。新式类搜索顺序图示如下,还可以通过类名.mro()查看新式类继承中的属性搜索顺序

继承这个概念是用来描述类与类之间的关系的。顾名思义,子类可以从父类继承内容。比如我们已经定义了一个Animal类,代码如下:

输出结果:

animal can eat

animal can sleep

animal can birth

但是美中不足的是,我们可以从上面看到,输出依然是:animal can....。这是很不舒服的,我们是否可以对子类进行改进呢?答案是可以的。示例代码如下:

输出结果:

Dog can eat

Dog can sleep

Dog can birth

Wow Wow

2,派生,从上面的例子可以看出除了继承外还有一种叫做派生,派生分为两种,一种是派生属性,一种是派生方法,

派生属性:单独属于这个类的属性。

派生方法:单独属于这个类的方法。

(2)多态:

多态指的是一类事物有多种形态

动物有多种形态:人,狗,猪

文件有多种形态:文本文件,可执行文件

多态需要注意的是关于面向对象的设计原则,是由java发展演变而来,现有三种基本设计原则,

1.开放封闭原则 于装饰器有关:

开放是给拓展开放 :可以再源代码的基础上增加功能而不能对源代码进行修改

封闭是给修改封闭:不能对源代码进行修改

2.依赖倒置原则

重点:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该应该依赖细节;细节应该依赖抽象。换言之,要针对接口编程,而不是针对实现编程

3.接口隔离原则

接口提取了一群类共同的函数,可以把接口当做一个函数的集合。 然后让子类去实现接口中的函数。 这么做的意义在于归一化,什么叫归一化,就是只要是基于同一个接口实现的类,那么所有的这些类产生的对象在使用时,从用法上来说都一样。

归一化,让使用者无需关心对象的类是什么,只需要的知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度

(3)封装

封装与扩展性

封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者的代码;而外部使用用者只知道一个接口(函数),只要接口(函数)名、参数不变,使用者的代码永远无需改变。这就提供一个良好的合作基础——或者说,只要接口这个基础约定不变,则代码改变不足为虑。

1.封装的概念:隐藏对象的属性和实现细节,仅对外提供公共访问方式。

广义:将代码装到一个容器里面。

狭义:给予每一种现象一个特定的名称。

2.私有化就是一种封装:

目的:将方法或者属性变为私有,使得不能被外部调用和继承。

私有化的特性: 1,当私有化后,在类外部不能直接调用,不论是属性还是方法,

2,遇到私有化的格式会在类的空间中将私有名变为 _类名__属性名/方法名

3.继承的时候,当不想要子类继承时候,利用私有化,子类将不会继承私有化的方法和属性

三个装饰器的使用:1,property:将类的方法伪装成属性

1.property和setter配合使用修改属性

2.property和delter配合使用删除属性或方法

2,classmethod:类方法”装饰后可将类名当做第一个参数的给予方法,从而在方法中调用类,并且不用实例化就能使用

3.startmethod:讲方法定义为公用方法,可以再外部当做函数调用,静态方法

实例

例1:

小明 体重 75.0 公斤

小明每次 跑步 会减肥 0.5 公斤

小明每次 吃东西 体重增加 1 公斤

例2:

1. 所用的知识 Animal类的封装 -> Dog类,Cat类,Person类的继承->多态

2. 把所有的共同属性和方法封装在一个公有类里面让子类继承父类的方法来实现和数据

3. 在创建一个小狗实例的时候,给它设置几个属性

你可能感兴趣的:(Python面向对象编程)