一:面向对象
1.什么是面向对象
面向对象是一种编写思想,是一种通过多个对象相互协作相互完成功能流程的编程思路,主要分为类的声明和定义,对象的创建和使用,它具有的特征有封装,继承,多态
2.为什么使用面向对象
程序的开发是为了软件的开发,软件的开发是为了解决问题
面向对象相对于面型过程来说,对相对比较复杂的业务来说,面向对象更占优势,对相对比较简单的业务来说,面向过程更好一点,当然在项目开发过程中,面向对象和面向过程一般是混合开发
二:类的声明和定义
类是数据类型的简称,可以将事物用代码的方式演绎
将事物抽象化
类的声明就是表示生活的事件,是一个概念,没有具体数据
操作步骤(是从大量的实际存在的物体中抽取他们拥有的共同特征以及行为):创建类型---定义特征--定义行为
操作规范:类型名称-帕斯卡命名法:一个或者多个单词组成
特征(属性)和行为(方法):尽量使用下划线命名法
def __init__(self)是创建好对象之后,初始化属性数据的方法,当创建对象之后,__init__()方法会自动执行
初始化公有属性的写法:self.name = name
之后定义行为
初始化私有属性的写法:self.__name = name
用函数设置封装私有属性:def set_name(self,name):
self.__name = name
用函数访问私有属性 :def get_name(self):
return self.__name
关于方法和函数:
函数是独立的,是一行或者多行代码,集合在一起形成的代码块,通过函数名称调用该函数,完成代码的功能
函数中可以声明几个形式参数,但是必须传递几个实际参数
方法是依赖类型的,和函数的定义是一样的,都是一行或者多行代码,集合在一起形成的代码块,但是它与函数不同的是
方法是通过(对象,名称)调用代码块,以此完成相应的功能
方法中的形式参数,第一个形式参数表示当前对象不需要传递参数,一般是默认,但是之后的形式参数,按照位置参数的方式传递数据
三:对象的定义与操作
对象是通过类型创建的,对象中会含有具体数据
对象的操作是类型存在的实际价值,对数据的处理
对象在代码中通过类型,创建,使用对象的行为和属性
对象的意义是在原来的方式下只是约定,并没有类型的详细确定,在面向对象里是有详细确定的
数据的整理:
变量中保存一个数据,表示一个复杂数据,可以通过多个变量存储多个数据实现
变量中保存一组数据,是通过组合数据类型来表示
对象中存储多个数据,表示复杂数据的专业操作方式
四 封装:
1.什么是封装
封装是对属性数据的安全保护,零散数据的统一整理,多种相似方法的统一整理,数据的保护,这些都需要封装
2.为什么需要封装?
为了保护敏感和隐私属性数据,让外界访问当前对象的属性数据时,可以按照指定的条件进行访问,为了提高属性数据的敏感性
3 怎么实现封装,封装的步骤
将当前类型中所有的属性私有化,给每个属性提供访问的属性数据的set/get方法
而且给敏感属性的访问方法中,添加限制条件
4.在那里使用封装?
任何出现在类型里的属性,都需要封装
5.封装的用法:
约定--约定如果一个属性是以一个下划线开头,则表示他是私有属性,不让直接操作
私有化————类型的属性,通过两个开头下划线,将属性表示私有数据,外界不能直接访问
可以通过提供的方法来访问
如果通过对象的引用变量,属性的直接赋值,该属性又不是类型中定义的属性
那么这个属性就是扩展属性,是专属于此对象的扩展属性
但是这样的扩展方式破坏了原来的封装语法,代码可读性下降,
我们可以在类型中定义好该对象可以出现属性,其他扩展属性可以不添加
7继承
继承的基本语法
体现的是一个小类型属于一个大类型的
生活中是约定
代码中是强制约束,通过继承关系,体现某类型属于另外一个类型
关于继承
Python中的所有类型都是直接或者间接继承object类型
Object:万物皆对象123456
Python3中类型声明语法分为隐式继承和显示继承
例如:class 类型名称 这就是隐式继承
Class 类型名称(object) 这就是显示继承
Python2中类型声明语法分为经典类和新式类
例如:class 类型名称 这就是经典类
Class 类型名称(object) 这就是新式类
继承的语法
Class 类型名称(要继承的类型)
继承的特性
代码中出现了继承,类型就出现了新名称
被继承的名称:父类
当前类型是子类
体现的是:子类继承父类
子类中就可以继承父类中的属性和方法(公共)
子类中可以直接使用父类的属性和方法
(运算符:类型判断运算符 isinstance 对象判断运算符 is)
子类类型使用父类数据
子类中访问父类的的方法:super().方法名称()
子类的__init__()方法
如果子类中没有写__init__方法,则直接使用父类的__init__方法初始化数据
如果子类中写了自己的__init__()方法,一定要调用父类中__init__()方法
当子类中出现独立属性的时候,子类需要写自己的__init__()方法
子类中可以重新定义父类中继承的方法(方法名称需要和方法参数一致):这就是方法重写
方法重写:子类中重写父类中存在的方法
在执行过程中如果子类重写了方法,执行子类的方法,否则执行父类中的方法
在继承关系中,python中有两种事物的存在
数据类型————所有的类型都是直接继承type类型的
对象—所有的对象都是直接或者间接继承object类型的
Python中所有的数据都是直接或者间接继承type类型的
重点是区分类型和对象的区别
子类中如何访问父类属性,super().name
我们继承了父类的什么
构造方法
__new__ 创建对象的方法(一般不使用直接通过父类创建对象即可)
__init__ 初始化数据的方法,一般会重写该方法,用来初始化对象数据
__slots__ 封装时限制属性
__str__ 对象字符打印方式,默认情况打印内存16进制表示的位置
__repr__ 交互模式下字符打印方式
__hash__ 获取对象的hash数据,用于判断的依据
__ne__不等于,两个对象使用!=判断的
__ge__大于等于
__gt__ 大于
__le__ 小于等于
__lt__ 小于
__eq__ 等于
__dict__ 将对象转换为字典
__doc__ 说明文档
__class__ 类型,类似type
__setattr__给属性设置数据一般不重写
:param 这是一个放大的参数说明
10,多继承、体现的是在不同场景下,可能扮演不同的角色
(设计时多态)
多继承的问题
如果不同的父类出现了相同名称的属性和方法
子类会继承谁的属性或者方法
Python3中广度优先
Python2中深度优先