面向对象三大特性

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

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

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

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

一、什么是类&对象

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

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

二特性

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

创建类和对象

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

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

行类中的函数

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

封装

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

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

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

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

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

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

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

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

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

  • 通过对象直接调用
  • 通过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间接获取被封装的内容。

调用过程

继承

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

简单的继承例子

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以后默认都是新式类了,所有我们使用新式类。

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

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

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

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

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

经典类

最后结果是A.f1

新式类

结果B.f1

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

总结一下:

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

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

最新文章

  1. 使用Cocos2d-x实现微信“天天爱消除”炫耀button特效
  2. ado.net增删改查操作
  3. Linq排序,获取前5条数据
  4. centos msyql 安装与配置
  5. python 学习(一)
  6. 散列表 (Hash table,也叫哈希表)
  7. 面试题: generate an equation, by inserting operator add ("+") and minus ("-") among the array to make equationExpression == 0
  8. Count the string -- HDOJ 3336
  9. C# Convert an enum to other type of enum
  10. SpringCloud(7)服务链路追踪Spring Cloud Sleuth
  11. Vue项目中GraphQL入门学习与应用
  12. 1 Servlet 简介
  13. 【XSY2715】回文串 树链剖分 回文自动机
  14. redis前端启动和后台启动的区别
  15. BGP - 5,BGP属性
  16. Java 12 - Java StringBuffer和StringBuilder类
  17. Windows Win7建立wifi热点,手机共享WIFI上网
  18. .NET:如何并行的从集合中返还元素?
  19. wysiwyg加ckeditor加 代码高亮
  20. jq模仿h5 placeholder效果

热门文章

  1. JavaEE学习之Spring声明式事务
  2. 第一行代码:以太坊(2)-使用Solidity语言开发和测试智能合约
  3. Centos 7安装RabbitMQ 3.7.8版本(单机版)-不使用RPM
  4. linux下的shell脚本(基本)
  5. python2中reload(sys)后设置编码
  6. H5 16-并集选择器
  7. CF每日一练 Codeforces Round #520 (Div. 2)
  8. main函数如何调用文件外的函数
  9. Day3 Python基础之while、for循环(二)
  10. vue入门(一)