1.什么是面向过程

  1. 在介绍面向对象之前,要先明确面向过程
  2. 在这之前我们所写的任何代码都是面向过程的
  3. 什么是面向过程? 是一种编程思想
  4. 面对 朝向 在编写代码时,要时刻想着过程这两个字
  5. 过程指的是什么?解决问题的步骤,流程,即第一步干什么,第二步干什么
  6. 其目的是将一个复杂的问题拆分为若干个小的问题,按照步骤一一解决
  7. 也可以说 将一个复杂的问题,流程化(为其制定一个固定的实现流程),从而变得简单化
  8. 面向过程编程 这种方式带来的优缺点:
  9. 优点:复杂的问题,简单化,
  10. 缺点:由于其实现流程是固定的,一旦中间某一个步骤发生了修改,将导致整体都需要修改
  11. 牵一发动全身
  12. 大白话:本来有一个实现某个功能的固定的流程,后来需要在原来的基础增加新的功能,这时候得全部重新设计一遍
  13. 扩展性差,维护性差
  14. 例如工厂里的流水线,一旦中间某个岗位出问题,整体就无法正常运行,第一个没做完,第二个做不了
  15. 使用场景:对扩展性要求较低的软件,比如系统内核,脚本程序(运维工程师写的程序,其目的是安装一堆软件),Apache,HTTP服务器
  16. 当我们要开发的程序需要非常高的扩展性时就不能再使用该方式了,比如说,qq经常会增加新功能

2. 什么是面向对象

  1. 由于面向过程所存在的缺点,才催生了新的编程思想
  2. 面向对象:
  3. 是一种编程思想,即编写代码的方式方法
  4. oop,是Object Oriented programming的简称,面向对象的英文缩写
  5. 将程序看做是一堆对象的集合,实现功能的方式就是对象之间的交互来实现
  6. 面向对象编程思想中最核心的概念就是 类与对象

3. 什么是对象?

  1. 一切皆对象
  2. 对象指的是,具备某些特征与技能的结合体,是实实在在存在的具体物体(描述完后我就能找到它)

4. 什么是类?

  1. 类就是类型,类别,分类
  2. 类是一个抽象概念,不是实际存在的,是根据一系列具备相同特征和技能的对象抽取得到的,比如说人类
  3. 类与对象之间的关系
  4. 类包含了一系列相同特征和技能的对象
  5. 对象是属于某各类的实例
  6. 在生活中是先有对象再根据对象的特征和技能 得到一个类型
  7. 程序员在程序中相当于上帝,需要什么就创造什么
  8. 在程序中先有类还是现有对象,先有类,才能通过类来产生对象,要先确定对象具备什么特征和什么行为才能产生对象
  9. 要将大象装进冰箱
  10. 打开冰箱
  11. 装进大象
  12. 关闭冰箱门
  13. 以上的实现方式,是面向过程的实现方式
  14. 换一种方式来实现
  15. 1. 找一个具备装大象这个技能的人来
  16. 2. 命令他去装大象
  17. 要开一家公司 挣钱
  18. 1.雇个财务
  19. 2.雇个人事主管
  20. 3.雇几个伙计
  21. 4.雇个秘书
  22. 5.给他们下达命令
  23. 以上方式不是面向过程,为什么?因为不关心财务如何算账,也不关心人事如何招人,只关心给他们下达命令
  24. 而是面向对象 财务 人事主管 几个伙计 秘书
  25. 如来要把经书传到东土大唐
  26. 如来,创造出,唐僧师徒,把任务交给他们,在完成整个取经任务的过程中,有一堆对象来参与
  27. 用面向对象的思想来完成任务,实际是在找一堆对象,让它们来完成任务
  28. 面向对象的优优缺点:
  29. 优点:
  30. 1. 不用考虑繁琐的实现步骤,从一个操作工,变成了老板
  31. 2. 扩展性高了,当需要一个新功能时,搞一个具备新功能的对象,命令它去完成任务
  32. 3. 各个对象之间的耦合度低,当一个对象出现问题,不会对其他对象产生影响
  33. 4. 可维护性高
  34. 缺点:1. 面向对象的复杂度比面向过程高
  35. 2. 无法预知执行结果/就像lol的游戏过程,一定不能把过程写死,每个英雄的行为是不固定的
  36. 使用场景:需要较高的扩展性时,(直接与用户发生交互的程序,例如qq,微信)
  37. 对于不需要扩展的程序而言,使用面向对象反而提高了复杂度
  38. 为什么要使用面向对象,因为在当前情况下,很多的程序都是与用户直接打交道的,而用户的需求千变万化,所有对扩展性要求非常高
  39. 面向对象编程的本质,就是使用不同的对象来完成程序
  40. 什么是类:是一个抽象概念,不是具体存在的
  41. 类是通过提取一系列对象的相同特征和技能得到的
  42. 类的作用是用于标识对象与对象之间的不同,通过类就能大致了解一个对象的特征和行为
  43. 什么是对象:具备某些特征和技能的结合体,是具体存在的某个物体(一切皆对象)
  44. 在生活中,先有对象再有类
  45. 在程序中,先有类再有对象

5.如何用类

  1. 在计算机创建一个人类对象
  2. 要得到对象,必须先告诉计算机,这个对象具备什么特征和行为,所有需要先定义类
  3. 类名要按照大驼峰的方式来书写 ThisIsPerson,每个单词的首字母都大写
  4. # import configparser
  5. # configparser.ConfigParser() 调用类
  6. # 在类中描述对象的特征和行为
  7. class Person:
  8. pass
  9. # 用变量来描述特征
  10. name = '李四'
  11. sex = 'man'
  12. age = '20'
  13. # 得到对象,通过调用类,也称之为实例化 或 创建对象
  14. obj = Person() 加括号表示调用类
  15. # 模块名为__main__,是一个Person类的对象,内存地址(真实地址)
  16. # 使用对象的属性(说的就是特征)
  17. 通过.语法
  18. print(obj.name)
  19. print(obj.age)
  20. print(obj.sex)
  21. class Student:
  22. number = '007'
  23. name = '盖伦'
  24. sex = 'male'
  25. age = 18
  26. # 学生的学校,由于每个学生的学校都是相同,所以将其放到类中
  27. school = 'Tsinghua'
  28. # 创建了两个学生对象
  29. stu1 = Student()
  30. stu2 = Student()
  31. print(stu1)
  32. print(stu2)
  33. # 每一个对象的内存地址都是不同的,在创建对象时,计算机会申请一个新的内存空间,并将对象中的内容存进去
  34. print(stu1.name)
  35. print(stu2.name)
  36. 值相同
  37. id也相同
  38. # 由于name的值是声明在类中的,所以每个对象使用的都是同一份

为对象单独指定属性

  1. stu1.name = '韩信'
  2. stu2.name = '陈大炮'
  3. print(stu1.name)
  4. print(stu2.name)
  5. # 每个对象的那么属性都不同,则意味需要给每个对象单独指定name
  6. # 存放属性的位置有两个,一个是类中,还有一个是对象中
  7. # 当每个对象的某个特征都相同时,则放到类中
  8. # 当每个对象的某个特征都不同时,则放到对象中
  9. # 通过__dict__可以获取一个对象中包含的内容
  10. print(stu1.__dict__)
  11. print(stu2.__dict__)
  12. # 获取类中包含的内容
  13. # print(Student.__dict__)

属性的访问顺序

  1. class Car:
  2. c_type = '破鞋'
  3. color = 'red'
  4. price = 40000
  5. c1 = Car()
  6. c2 = Car()
  7. print(c1.__dict__)
  8. print(c2.__dict__)
  9. print(c1.c_typr) # 有值,是取得类里的
  10. #当对象中不存在时会到类里去找属性
  11. c1.c_type = '法拉利'
  12. print(c1.__dict__)
  13. print(c2.__dict__)
  14. print(c1.c_typr) # 有值,取得对象自己的
  15. print(c2.c_type)
  16. # 如果对象中存在这个属性,优先访问对象中的属性
  17. # 查找顺序为 对象->类
  18. # 当创建一个类的时候,产生名称空间,存储类中名称和值的绑定关系
  19. # 当创建一个对象的时候,产生名称空间,存储对象中名称和值的绑定关系
  20. # 类还有另一个作用,就是作为对象的模板,所有属于同一个类的对象,都具备类中的公共属性
  21. # 即使我们什么都不写,类中也存在一些自带的属性,是从父类得到的(继承会详细讨论)

初始化函数(同一个模块里不能有同名的类

class Student: pass

指定属性

  1. stu1.name = '张无忌'
  2. stu1.sex = 'male'
  3. stu1.age = 18
  4. stu2= Student()
  5. stu2.name = '周芷若'
  6. stu2.sex = 'female'
  7. stu2.age = 78
  8. # 定义一个函数,用于为对象设置属性
  9. def set_sttr(obj,name,sex,age):
  10. obj.name = name
  11. obj.sex = sex
  12. obj.age = age
  13. stu3 = Student()
  14. stu4=Student()
  15. set_attr(stu3,'灭绝','male',88)
  16. set_attr(stu4,'金毛狮王','female',88)
  17. #set_attr这个函数目的是用于设置对象的属性,如果没有对象,该函数就没有存在的意义,也就是初始化函数与类应该是一个整体
  18. # 应该将这个函数放到类中
  19. stu3 = Student()
  20. stu4 = Student()
  21. Student.set_attr(stu3,'金毛狮王','male',80)
  22. print(stu3.__dict__)
  23. Student.set_attr(stu4,'张全蛋','male',28)
  24. print(stu4.__dict__)
  25. # 现在已经简化了代码,但是对象的创建与初始化步骤是分开的,通常对象一旦创建,就应该进行初始化,所有最好时将创建于初始化进行绑定
  26. # 作为一个人,一旦出生,性别必须要指定
  27. # 带有__开头__结尾的函数,是一些特殊的内置函数,会在某个时间点自动触发执行
  28. class Person:
  29. # 初始化函数名称是固定的,该函数会在调用类时自动执行,self参数必须有,表示要进行初始化的对象,系统会自动传值
  30. def __init__(self):
  31. print('执行了__init__')
  32. print(self)
  33. self.name = '张三丰'
  34. self.age = 18
  35. p1 = Person('张三丰',88)
  36. print(p1.__dict__)
  37. p2 = Person('李狗蛋',28)
  38. print(p2.__dict__)
  39. #init函数用于初始化对象,它会在创建对象时,自动执行,并传入调用时传递的参数.第一个参数表示要初始化的对象本身
  40. # self(第一个)参数不需要手动传递
  41. # self表示自己,是一个形式参数,名字可以随便取,但是不建议修改

绑定方法

  1. 把两个东西捆绑在一起
  2. 方法:就是函数
  3. 函数是专业术语,不好理解,面向对象编程思想,是要我们模仿现实生活中的抽象概念,为了方便理解把函数称之为方法
  4. 绑定方法是把对象与函数进行绑定
  5. 为什么要把方法与对象进行绑定
  6. 调用函数就变成了调用对象的方法
  7. 对象本质上就是一种存放数据的容器
  8. 为什么要把数据与函数绑定在一起
  9. 函数适用于处理数据的代码
  10. 绑定方法就是将数据与处理数据的函数绑定在一起
  11. 将要处理的数据和处理数据的函数进行绑定
  12. # 第一个问题传递参数,必须手动传递,很有可能传参顺序而发生错误
  13. # 第二个问题每次处理数据 都需要手动传参数
  14. # 第三个问题 当要处理的数据特别的多 就不能再定义为变量了 你可以使用列表出来存储要处理的数据
  15. # 但是 每次处理 都需要先获取数据 在传递给处理数据的函数
  16. # 所以将 要处理的数据与 处理数据的函数进行绑定
  17. # 如何使用绑定方法
  18. class Student:
  19. school = 'Beijing'
  20. def __init__(self,name,sex,age):
  21. self.name = name
  22. self.sex = sex
  23. self.age = age
  24. def learning(self):
  25. print('正在学习')
  26. def sayHi(self):
  27. print(self,'正在打招呼...')
  28. # 在默认情况下,在类中定义的函数都是绑定方法,共同点是,都会将对象作为第一个参数,也就是self
  29. stu1 = Student('一个学生','male',18)
  30. stu1.sayHI()
  31. Student.sayHI(stu1)
  32. # 当用对象来调用类中的方法时,默认会把对象传入方法中
  33. # 2️而用类名来调用时,则需要手动传入对象
  34. ptint(stu1.sayHI)
  35. # bound method Student.sayHI函数,现在把这个函数绑定给了内存地址的对象
  36. stu2 = Student('李四','女',19)
  37. stu2.sayHI()
  38. print(stu2.sayHI)
  39. # 只要拿到对象,就同时拿到了数据和处理数据的方法

绑定给类的方法

  1. class Student:
  2. school = 'beijing'
  3. #绑定方法分两种,一种是绑定给对象的,一种是绑定给类的
  4. def sayhello(self):
  5. print(self.name,'说你好')
  6. @classmethod
  7. def print_school_name(self):
  8. print('学校名为:%s' % school)
  9. #绑定给类的方法,使用一个装饰器,叫classmethod,必须有一个参数,表示当前类,建议不修改
  10. # 这是绑定给对象的方法,可以使用对象来调用,也可以使用类名来调用
  11. 在对象调用时会自动传入对象自己
  12. 类调用时不会自动传参
  13. # 类的绑定方法,对象和类都能调用,并且都会自动传入这个类
  14. stu1 = Student('印度阿三,'woman',20)
  15. stu1.print_school()
  16. def sayhello(self):
  17. print(self.name,'说你好')
  18. @classmethod
  19. def print_school_name(cls):
  20. print(cls.school)
  21. print('学校名为:%s' % school)
  22. # 如何定义对象绑定方法,以及类的绑定方法
  23. # 在调用时的区别
  24. # 一个方法到底应该绑定给对象还是给类
  25. # 当要处理的数据包含在类中时,就应该绑定给类
  26. # 当要处理的数据包含在对象中时,就应该绑定给对象
  27. # 类的绑定方法和对象的绑定方法的相同与不同
  28. 相同点:
  29. 1.都会自动传值
  30. 2.都可以被类和对象调用
  31. 不同点:
  32. 1.对象绑定方法在对象调用时,传的是对象自己,而类绑定方法自动传的是类自己
  33. 2.第一个参数,一个cls,一个叫self
  34. 为什么要绑定:
  35. 之所以绑定,简化代码,提高效率
  36. 对象绑定方法 可以使用对象来调用 也可以使用类名来调用
  37. # 在对象调用时会自动传入对象自己
  38. # 类调用时不会自动传参

非绑定方法

  1. class Teacher:
  2. def __init__(self,name,sex):
  3. self.name = name
  4. self.sex = sex
  5. @staticmethod # 用于定义一个非绑定方法
  6. def test_func(num):
  7. print('test_func run!')
  8. print(num)
  9. Teacher.test_func(1)
  10. t1 = Teacher('egon','男')
  11. t1.test_func(1)
  12. # 什么是非绑定方法,在类中定义,即不绑定给类,也不绑定给对象
  13. 特点:没有自动传参数的效果,类和对象都能调用,就是一个普通函数
  14. 当你的这个功能不需要访问类的数据,也不需要访问对象的数据,就可以作为一个非绑定方法
  15. 使用场景较少
  16. class Teacher:
  17. def __init__(self,name,sex):
  18. self.name = name
  19. self.sex = sex
  20. # @staticmethod 用于定义个非绑定方法
  21. @staticmethod
  22. def test_func(num):
  23. print("test_func run!")
  24. print(num)
  25. Teacher.test_func(1)

day22 面向对象基础的更多相关文章

  1. 了解JavaScript 面向对象基础 & 原型与对象

    面向对象语言中的对象 老是能听到什么基于对象, 面向对象. 什么是对象, 如果有面向对象基础的人可以无视了, 下面举个简单的例子给大家讲讲面向对象中, 对象的定义, 这个是比较通用的, 不过对于JS来 ...

  2. MYSQL、PHP基础、面向对象基础简单复习总结

    一.MYSQL         1.配置MySql                 第一步安装服务器(apache).                 第二部安装MySql界面程序         2 ...

  3. 从零开始学Python第六周:面向对象基础(需修改)

    标签(空格分隔): 面向对象 一,面向对象基础 (1)面向对象概述 面向过程:根据业务逻辑从上到下写代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类 ...

  4. python面向对象基础

    面向对象基础 1. 简述 编程方式: 面向过程: 根据代码在脚本的堆叠顺序,从上到下依次执行 函数式编程:将相同功能的代码封装到函数中,直接调用即可,减少代码重复性 面向对象:对函数进行分类和封装,将 ...

  5. java基础学习05(面向对象基础02)

    面向对象基础02 实现的目标 1.String类的使用2.掌握this关键字的使用3.掌握static关键字的使用4.了解内部类 String类 实例化String对象一个字符串就是一个String类 ...

  6. java基础学习05(面向对象基础01--类实例分析)

    面向对象基础01(类实例分析) 实现的目标 1.如何分析一个类(类的基本分析思路) 分析的思路 1.根据要求写出类所包含的属性2.所有的属性都必须进行封装(private)3.封装之后的属性通过set ...

  7. java基础学习05(面向对象基础01)

    面向对象基础01 1.理解面向对象的概念 2.掌握类与对象的概念3.掌握类的封装性4.掌握类构造方法的使用 实现的目标 1.类与对象的关系.定义.使用 2.对象的创建格式,可以创建多个对象3.对象的内 ...

  8. 8.python笔记之面向对象基础

    title: 8.Python笔记之面向对象基础 date: 2016-02-21 15:10:35 tags: Python categories: Python --- 面向对象思维导图 (来自1 ...

  9. 【重走Android之路】【Java面向对象基础(三)】面向对象思想

    [重走Android之路][基础篇(三)][Java面向对象基础]面向对象思想   1 面向对象的WWH   1.1 What--什么是面向对象         首先,要理解“对象”.在Thinkin ...

随机推荐

  1. kvm云主机使用宿主机usb设备

    有些时候KVM客户机还是要使用USB设备,比如USB密钥等 KVM命令行参数 -usb 打开usb驱动程序,启动客户机usb支持-usbdevice devname 为客户机增加usb设备,devna ...

  2. 插件:★★★ !!!图片懒加载 lazyload.js 、 jquery.scrollLoading.js

    插件:图片懒加载 jquery.lazyload.js 2016-3-31 插件说明:http://www.w3cways.com/1765.html (小插件,好用) 下载地址: https://r ...

  3. CDH 安装遇到的问题

    CDH  遇到的问题 l JAVA_HOME问题 这里, 很明显可以看到, JAVA_HOME 并没有设置成功.using  as ... 感觉完全就是没有设置JAVA_HOME 这个环境变量.可是呢 ...

  4. Android dialog使用

    翻译自:开发->API 指南->User Interface & Navigation->Dialogs 注意: dialog是一个基类,但是我们应该尽可能避免直接使用dia ...

  5. C# IIS 服务器上传图片500解决办法

  6. web安全/渗透测试--1--web安全原则

    web 安全:  https://blog.csdn.net/wutianxu123/article/category/8037453/2 web安全原则 安全应该是系统开发之初就考虑的问题.换句话说 ...

  7. Spring cloud info信息显示

    父工程添加配置如下 <build> <finalName>microservicecloud</finalName> <resources> <r ...

  8. Redis-Desktop-Manager的下载与使用

    redis可视化工具 参考 https://blog.csdn.net/Future_LL/article/details/84591057

  9. 函数mmap()的使用

    函数mmap是linux的一个系统函数.如下: 函数原型:void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t ...

  10. a stop job is running for Security Auditing Services

    内核是3.10.0-514.el7,启动时有如下报错: a stop job is running for Security Auditing Services(56s / 1min 30s) 系统启 ...