复习----面向对象

Posted yan-night

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了复习----面向对象相关的知识,希望对你有一定的参考价值。

本节内容:

1、概述

2、创建类和对象

3、面向对象三大特性

  3.1封装

  3.2继承

  3.3多态

 

 

1、概述

编程范式

编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程,一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很多种不同的方式,对这些不同的编程方式的特点进行归纳总结得出来的编程方式类别,即为编程范式。不同的编程范式本质上代表对各种类型的任务采取的不同的解决问题的思路,大多数语言只支持一种编程范式,当然也有些语言可以同时支持多种编程范式。两种最重要的编程范式分别是面向过程编程和面向对象编程,而python还支持函数式编程。

 

  • 面向过程:根据业务逻辑从上到下写垒代码
  • 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
  • 面向对象:对函数进行分类和封装,让开发“更快更好更强...”

 

面向对象编程(Object Oriented Programming,OOP

OOP编程是利用“类”和“对象”来创建各种模型来实现对真实世界的描述,使用面向对象编程的原因一方面是因为它可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率 ,另外,基于面向对象的程序可以使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容。

  面向对象的几个核心特性如下:

  Class 类:一个类即是对一类拥有相同属性的对象的抽象、蓝图、原型。在类中定义了这些对象的都具备的属性(variables(data))、共同的方法。

  Object 对象:一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性,就像人类是指所有人,每个人是指具体的对象,人与人之前有共性,亦有不同。

  Encapsulation 封装:在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法。

  Inheritance 继承:一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承。

  Polymorphism 多态:多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,指一个基类中派生出了不同的子类,且每个子类在继承了同样的方法名的同时又对父类的方法做了不同的实现,这就是同一种事物表现出的多种形态。编程其实就是一个将具体世界进行抽象化的过程,多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进行对话。

 

 

2、创建类和对象

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

  •  类就是一个模板,模板里可以包含多个函数,函数里实现一些功能。
  •  对象则是根据模板创建的实例,通过实例对象可以执行类中的函

技术图片

 

 

 1 #创建类
 2 class Bar:
 3 
 4     #创建类中的函数
 5     def foo(self,arg):
 6         print(self,arg)
 7 
 8 #根据类Bar创建对象z1
 9 z1 = Bar()
10 print(z1)       #输出该对象地址
11 z1.foo(111)     #执行Bar方法
  • class是关键字,表示类。
  • 创建对象,类名称后面加括号即可。
  • 类中定义的函数叫做“方法”。

 

函数式编程与面向对象编程的适用性

在Python中函数式编程与面向对象编程两者皆可用,不同于Java与c。然而皆可用的结果就导致会出现一些纠结,什么时候用比较合适呢。

从明面上看,使用函数式编程和面向对象编程方式来执行一个“方法”时函数要比面向对象简便。

  • 面向对象:【创建对象】【通过对象执行方式】
  • 函数编程:【执行函数】

观察上述对比答案则是肯定的,然后并非绝对,场景的不同适合其的编程方式也不同。

 

函数式适合应用的场景为:各个函数之间是独立且无共用的数据。

面相对象则适用于多个函数中有一些相同参数的情况。如下:

 1 class DataBaseHelper:
 2     
 3         def __init__(self, ip, port, username, pwd):
 4             self.ip = ip
 5             self.port = port
 6             self.username = username
 7             self.pwd = pwd
 8         
 9         def add(self,content):
10             # 利用self中封装的用户名、密码等   链接数据
11             print(content)
12             # 关闭数据链接
13         
14         def delete(self,content):
15             # 利用self中封装的用户名、密码等   链接数据
16             print(content)
17             # 关闭数据链接
18         
19         def update(self,content):
20             # 利用self中封装的用户名、密码等   链接数据
21             print(content)
22             # 关闭数据链接
23             
24         def get(self,content):
25             # 利用self中封装的用户名、密码等   链接数据
26             print(content)
27             # 关闭数据链接
28 
29 s1 = DataBaseHelper(1.1.1.1,3306, 李四, sb)

 

 

 

3、面向对象的三大特性

面向对象的三大特性是指:封装、继承和多态。

 

3.1封装

封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。

所以,在使用面向对象的封装特性时,需要:

  • 将内容封装到某处
  • 从某处调用封装的内容

 

将内容封装到某处

技术图片

 

self 是一个形式参数,当执行 zhongjianren = Bar(‘中间人‘,33) 时,self 等于zhongjianren 

所以,内容其实被封装到了对象 zhongjianren中,若有多个对象,则每个对象中都有 name 和 age 属性,在内存里类似于下图来保存。

技术图片

 

 从某处调用被封装的内容

调用被封装的内容时,有两种情况:

  • 通过对象直接调用
  • 通过self间接调用

 技术图片

 

 综上所述,对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封装的内容。

 

3.2继承

继承,面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容。

继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

通过继承创建的新类称为“子类”或“派生类”。

被继承的类称为“基类”、“父类”或“超类”。

在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。

 

继承的语法

技术图片

 所以,对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法

 

多继承

  • Python的类可以继承多个类,Java和C#中则只能继承一个类。
  • Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先 广度优先。

技术图片

 

 

在Pyhon2中,经典类是按深度优先来继承的,新式类是按广度优先来继承的。

在Python3中,经典类和新式类都是按广度优先来继承的。

经典类和新式类,从字面上可以看出一个老一个新,新的必然包含了跟多的功能,也是之后推荐的写法,从写法上区分的话,如果当前类或者父类继承了object,那么该类便是新式类,否则便是经典类。

而在Python3中,继承的父类会默认继承obje类。

 

多继承的顺序

 1 class D(object):
 2 
 3     def bar(self):
 4         print D.bar
 5 
 6 
 7 class C(D):
 8 
 9     def bar(self):
10         print C.bar
11 
12 
13 class B(D):
14 
15     def bar(self):
16         print B.bar
17 
18 
19 class A(B, C):
20 
21     def bar(self):
22         print A.bar
23 
24 a = A()
25 # 执行bar方法时
26 # 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错
27 # 所以,查找顺序:A --> B --> C --> D
28 # 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
29 a.bar()

 

继承中一些注意事项:

1、当继承父类后,不想执行父类的方法时,可以进行重写。同方法名,优先执行子类方法。

2、无论在哪里调用对象,self永远是执行该方法的调用者。

3、当子类与父类有共同方法,想调用父类方法时,可使用super方法或调用父类名如:

  super(子类,self).父类中的方法()

  父类名.父类中的方法(self,···)  ——>py2中常用,但这种方法不推荐使用,因为一旦父类发生变化,方法调用位置的 类名 同样需要修改

 

 

3.3多态

多态与多态性

多态:多态指的是一类事物有多种形态(一个抽象类有多个子类,因而多态的概念依赖于继承)

多态性:多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。

多态性使用的前提:①类的继承关系 ②要有方法重写。

 

语法

 1 class Animal:  # 同一类事物:动物
 2     def run(self):
 3         pass
 4 
 5 class Cat(Animal):  # 动物的形态之一:猫
 6     def run(self):
 7         print(cat runs)
 8 
 9 class Dog(Animal):  # 动物的形态之二:狗
10     def run(self):
11         print(dog runs)
12 
13 class Pig(Animal):  # 动物的形态之三:猪
14     def run(self):
15         print(pig runs)
16 
17 
18 #多态性:定义统一的接口
19 def func(obj):      #obj这个参数没有类型限制,可以传入不同类型的值
20     obj.run()       #调用的逻辑都一样,执行的结果却不一样
21 
22 func(Cat)
23 func(Dog)
24 func(Pig)

 

在python中多态的使用不如Java与C#中那么明显,所以python中刻意谈到多态的意义不是特别大。

 

以上是关于复习----面向对象的主要内容,如果未能解决你的问题,请参考以下文章

python 面向对象基础和高级复习

Java知识面试题复习Java面向对象

Java知识面试题复习Java面向对象

python复习-面向对象拾遗

Java基础复习---第三章

Java面试复习(纯手打)