1.面向对象相关知识
面向对象编程:Object Oriented Programming(简称OOP)
1.面向过程
- 侧重于怎么做
- 把完成某一个需求的所有步骤从头到尾逐步实现
- 根据开发要求,将某些功能独立的代码封装成一个又一个函数
- 最后完成的代码,就是顺序的调用不同的函数
2.面向过程的特点
- 注重步骤和过程,不注重职责分工
- 如果需求复杂,代码变得非常复杂
- 开发复杂的项目的时候,没有固定的套路,开发难度很大
3.面向对象
- 侧重于谁来做
- 相比较函数,面向对象是更大的封装,根据职责在一个对象中封装多个方法
- 在完成某一个需求前,首先确定职责–要做的事(方法)
- 根据职责确定不同的对象,在对象内部封装不同的方法(多个)
- 最后完成代码,就是顺序的让不同的对象调用不同的方法
4.面向对象的特点
- 注重对象和职责,不同的对象承担不同的职责
- 更加适合对复杂的需求变化,是专门应对复杂项目的开发,提供固定的套路
- 需要在面向过程的基础上,再学习一些面向对象的语法
5.面向对象有两个核心的概念:类和对象
- 类: 是一类具有相同特征或行为的事物的一个统称
- 对象: 由类创建出来的一个具体的存在
- 类和对象的关系:先有类再有对象
- 类是模板, 对象是根据这个模板创建出来的
- 类只需要有一个,对象可以有多个
6.类:属性(这一类事务的共同信息) 和 方法(你能完成的动作)
- 类名:这类事物的名字(大驼峰命名法)
- 大驼峰命名法:每个单词的首字母大写;单词与单词之间没有下划线
- 属性:这个类创建出来的对象有什么特征
- 方法:这个类创建出来的对象有什么行为
- 类名的确定: 名词提炼法分析整个业务流程,出现的名词,通常就是找到的类
- 属性和方法的确定:
- 对 对象的特征描述,通常可以定义成属性
- 对象具有的行为(动词),通常可以定义为方法
- 注意:当需求中没有涉及的属性或方法在设计类时,不需要考虑
2.面向对象编程常用的方法
1.self
- 含义: 哪一个对象调用的方法,self就是哪一个对象的引用(指向对象的内存地址空间)
- 在调用方法的时候,程序员不需要传递self参数(定义的时候 第一个参数必须是self)
- 示例1
- 示例2
2.初始化方法
- 这个初始化方法是内置方法,是专门用来定义一个类据有哪些属性和方法的
- 类名( ) 就可以创建一个对象
- 类名( ) 创建对象的时候,python解释器会自动执行以下操作
- 为对象在内存中分配空间–创建对象
- 调用初始化方法为对象的属性设置初始值
- 示例1
- 示例2
3.str内置函数
- 在python中使用print输出对象变量的时候,默认情况下会输出这个变量引用的对象是由哪一类创建的对象以及在内存中的地址
- 如果在开发中,希望使用print输出变量的时候,能够打印自定义内容
- 就可以利用__str__这个内置的方法
- 返回值必须为一个字符串
- 示例
4.del内置函数
- 如果希望在对象被销毁之前,再做一些事情,可以考虑使用__del__
- 当一个对象被从内存中销毁前(把这个对象删除掉)会自动调用__del__方法
- 示例
3.面向对象的特点:封装、继承和多态
1.封装
- 封装是面向对象编程的一大特点
- 面向对象编程的第一步,将属性和方法封装到一个抽象的类中
- 外界使用类创建对象,然后让对象调用方法
- 对象方法的细节都被封装在类的内部
- 示例
2.继承
- 继承具有传递性
- 当父类方法的实现不能满足子类的需求的时候
- 可以对父类方法进行重写:
- 覆盖父类方法;对父类的方法进行扩展
- 继承的使用
- 覆盖父辈的方法,继承有传递型
- 扩展父辈的方法,继承有传递型
- 初始化方法也需要继承
- 关于新式类和旧式类
object是Python为所有对象提供的基类,提供有一些内置的属性和方法,可以使用dir函数查看
新式类:以object为基类的类
经典类 不以object为基类的类
在python3.X中定义的类时,如果没有指定父类,会默认使用object作为基类--python3.x中定义的类都是新式类
在python2.x中定义类时,如果没有指定父类,则不会以object作为基类
为保证编写的代码能够同时在python2.x和python3.x运行
今后在定义类时,如果没有父类,建议统一继承自object
- 当继承的基类(父类)有多个,且多个基类中有同名方法时,如何调用输出
3.多态(以封装和继承为前提)
- 不同的子类对象调用相同的方法,产生不同的执行结果
4.面向对象的其他方法
1.类属性和类方法
- 类属性:针对类对象定义的属性 使用赋值语句在class关键字下可以定义类属性
- 类方法:针对类对象定义的方法 在类方法内部可以直接访问类属性或者调用其他的类方法
- 类属性和类方法都可以不需对象直接调用
- 示例:使用赋值语句,记录所有的玩具数量
2.静态方法
- 静态方法:通过类名, 调用静态方法
- 不需要创建对象直接就可以调用
3.私有属性和私有方法
4.单例设计模式
- 设计模式:
- 设计模式是前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对某一特定问题的成熟解决方案
- 使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码可靠性
- 单例设计模式
- 目的:让类创建对象,在系统中只有唯一的一个实例(对象)
- 每一次执行类名( )返回的对象,内存地址是相同的
- 怎么保证这些对象只有一个
- 可以使用__new__方法:
- 我们用 “类名.”的方式创建对象的时候,python解释器会帮我们做两件事情:为对象分配空间和对象初始化
- 使用类名()创建对象时,python的解释器首先会调用__new__方法为对象分配空间
- __new__是一个由object基类提供的内置的静态方法,主要有两个作用:在内存中为对象分配空间和返回对象的引用
- python的解释器获得对象的引用后,将引用作为第一个参数,传递给__init__方法
- new:负责给对象分配空间 init(初始化方法)负责给对象初始化
- 如何重写__new__方法
- 我们要重写new方法,使用类名()创建对象的时候,返回的都是同一个地址
- 重写__new__方法的代码非常固定:
- 1>继承自父类方法
- 2>返回父类方法调用_new__方法的结果
- 重写__new__方法一定要return object.new(cls)
- 否则python的解释器得不到分配了空间的对象引用,就不会调用对象的初始化方法
- 示例1
- 示例2