python之旅六【第七篇】面向对象

时间:2021-10-28 11:38:02

面向对象三大特性

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

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

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

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

一、什么是类&对象

类:可以理解为他是一个模板,比如人们在说“人”这个名词的时候,没人知道这个“人”具体是指那个人!

对象:对象是一个实际的物体,他有自己的属性和特征、行为的,比如alex和eric,当说到这两个人的时候就会想到,alex很猥琐、eric很闷骚他们的特征、动作啊都能具体的显示出来!

二特性

封装
继承
多态(很少有用)

创建类和对象

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

 对象则是根据模板创建的实例,通过实例对象可以执

行类中的函数

python之旅六【第七篇】面向对象

  • class是关键字,表示类
  • 创建对象,类名称后加括号即可
  • 类中的函数第一个参数必须是self
  •  类中定义的函数叫做 “方法”

封装

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

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

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

第一步:将内容封装到某处

python之旅六【第七篇】面向对象

self 是一个形式参数,当执行 obj1 = Foo('wupeiqi', 18 ) 时,self 等于 obj1

当执行 obj2 = Foo('alex', 78 ) 时,self 等于 obj2

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

python之旅六【第七篇】面向对象

第二步:从某处调用被封装的内容

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

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

1、通过对象直接调用被封装的内容

上图展示了对象 obj1 和 obj2 在内存中保存的方式,根据保存格式可以如此调用被封装的内容:对象.属性名

 class Foo:

     def __init__(self, name, age):
self.name = name
self.age = age obj1 = Foo('wupeiqi', )
print obj1.name # 直接调用obj1对象的name属性
print obj1.age # 直接调用obj1对象的age属性 obj2 = Foo('alex', )
print obj2.name # 直接调用obj2对象的name属性
print obj2.age # 直接调用obj2对象的age属性

2、通过self间接调用被封装的内容

执行类中的方法时,需要通过self间接调用被封装的内容

 class Foo:

     def __init__(self, name, age):
self.name = name
self.age = age def detail(self):
print self.name
print self.age obj1 = Foo('wupeiqi', )
obj1.detail() # Python默认会将obj1传给self参数,即:obj1.detail(obj1),所以,此时方法内部的 self = obj1,即:self.name 是 wupeiqi ;self.age 是 obj2 = Foo('alex', )
obj2.detail() # Python默认会将obj2传给self参数,即:obj1.detail(obj2),所以,此时方法内部的 self = obj2,即:self.name 是 alex ; self.age 是

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

调用过程

python之旅六【第七篇】面向对象

继承

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

简单的继承例子

class F:
def f1(self):
pass class S(F): #继承
def f2(self):
pass
obj = S()
obj.f2()
obj.f1() #可以执行了

上面的例子就是S类继承了F类,然后S类具有了F类的属性,这样就可以执行了。

基类和派生类

上面的例子中F就是基类,S就是派生类

新式类与经典类

python3.x以后默认都是新式类了,所有我们使用新式类。

python之旅六【第七篇】面向对象

上面的截图!有(object)就是新式类,有什么区别!新式类,有些修改和新增了一些功能,以后建议使用“新式类”

这里需要提的一点是在多继承的时候的问题:

不管是直接、或间接的继承新式类,那么你的类也是新式类!

python支持多继承的,其他语言一般不支持的

当类是经典类时,多继承情况下,会按照深度优先,纵向优先方式查找
当类是新式类时,多继承情况下,会按照广度优先,横向优先方式查找

经典类

python之旅六【第七篇】面向对象

最后结果是A.f1

新式类

python之旅六【第七篇】面向对象

结果B.f1

注意只有上面这种情况属于新式类的广度优先

总结一下:

以上就是本节对于面向对象初级知识的介绍,总结如下:

  • 面向对象是一种编程方式,此编程方式的实现是基于对  和 对象 的使用
  • 类 是一个模板,模板中包装了多个“函数”供使用
  • 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数
  • 面向对象三大特性:封装、继承和多态