- 面向对象和面向过程的基本概念
面向过程:侧重于怎么做。
1、把完成一个需求的所有步骤 从头到尾 逐步实现
2、根据开发要求,将某些功能独立的代码封装成一个又一个函数
3、最后完成的代码,就是顺序调用不同的函数。
特点:
注意步骤与过程,不注意职责分工;
如果需求复杂,代码会变的很复杂;
开发复杂项目,没有固定的套路,开发难度大
面向对象:谁来做?
相比较函数,面向对象是更大的封装,根据职责在一个对象中封装多个方法。
1、在完成某一个需求前首先确定职责---要做的事(方法)
2、根据职责,确定不同的对象,在对象内部封装不同的方法(多个)
3、最后完成代码,就是顺序让不同的对象调用不同的方法。
特点:
1、注重对象和职责,不同的对象承担不同的职责
2、更加适合对复杂的需求变化,是专门应对复杂项目的开发,提供固定的套路
3、需要在面向过程的基础上,在学习一些面向对象的语法
- 熟悉面向对象编程
python java c++
类: 是对一群具有相同特征或行为的事物的一个统称,不能直接使用(比如:飞机没有制造图纸不能上天)
特征: 属性
行为: 方法
对象: 由类创建出来的一个具体的存在,可以直接使用(用图纸造出来的飞机可以飞上天)
在程序开发中: 应该先有类 再有对象
类的设计
1、类名 这类事物的名字,满足大驼峰命名法
大驼峰命名法
每一个单词首字母大写’单词与单词之间没有下划线
2、属性 这类创建出的对象有什么特征
2、这个类创建出的对象有什么样的行为
- 初始化方法:init是python对象的内置方法
init方法是专门用来定义一个类具有哪些属性和方法的。
初始化方法
我们现在已经知道了使用类名()就可以创建一个对象
当使用类名()创建对象时,python解释器会自动执行以下操作:
1、为对象在内存中分配空间--创建对象
2、调用初始化方法为对象的属性设置初始值--初始化方法(init),这个初始化方法就是init方法,init是对象的内置方法
init方法是专门用来定义一个类具有哪些属性的方法。
哪一个对象调用的方法,self就是哪一个对象的引用
在类封装的方法内部,self就表示当前调用方法的对象自己
调用方法时,程序员不需要传递self参数(但是定义时,第一个参数必须是self)
在方法内部:可以通过self.访问对象的属性
在方法内部:可以通过self.调用其他的对象和方法
- 内置方法:
del方法:对象被从内存中销毁前,会自动调用
str方法:返回对象的描述信息 print 对象
del方法:当一个对象被从内存中销毁前(把这个对象从内存中删除掉),会自动调用del方法
应用场景
del如果希望在对象被销毁前,再做一些事情,可以考虑以下调用del方法
str方法:再python中,使用python输出对象变量,默认情况下,会输出这个变量引用是由哪一个类创建的对象,以及在内存中的地址(16进制表示)
如果在开发中,希望使用print输出对象变量时,能够打印自定义的内容,就可以利用str这个内置方法了。
自动调用del方法
主动调用del方法
生命周期:一个对象从调用类名()创建,声名周期开始。一个对象的del方法一旦被调用,生命周期就算结束
私有属性和私有方法
应用场景及定义方式
应用场景: 在实际开发中,对象的某些属性或者方法可能只希望在对象的内部使用,而不希望在外部被访问到。
私有属性就是对象不希望被公开的对象
私有方法就是不希望公开的方法
定义方法
在定义属性或者方法时,在属性名前增加两个下划线,定义的就是私有属性或方法。
封装 继承和多态
1、封装是面向对象编程的一大特点
2、面向对象编程的第一步,将属性和方法封装到一个抽象的类中,因为类不能直接使用
3、外界使用类创建对象,然后让对象调用方法
4、对象方法的细节都被封装在类的内部
案例1:
小明喜欢跑步
体重75公斤
每次跑步会减肥0.5公斤
每次吃东西会增加1公斤
小美的体重是45公斤
案例2:
需求:摆放家具
1.房子有户型,总面积和家具名称列表
新房子没有任何的家具
2.家具有名字和占地面积,其中
床:占4平米
衣柜:占2平面
餐桌:占1.5平米
3.将以上三件家具添加到房子中
4.打印房子时,要求输出:户型,总面积,剩余面积,家具名称列表
被使用的类应该先开发
注意return的使用
将return注释掉之后得到的结果
案例3
需求:
1.士兵瑞恩有一把AK47
2.士兵可以开火(士兵开火扣动的是扳机)
3.枪 能够 发射子弹(把子弹发射出去)
4.枪 能够 装填子弹 --增加子弹的数量
**面向对象的三大特征
- 封装:根据职责将属性和方法封装到一个抽象的类中
- 继承: 实现代码的重用,相同的代码不需要重复的写
- 多态
单继承:子类拥有父类的所有属性和方法
继承的语法
class 类名(父类):
def 子类特有的方法
继承的传递性:(爷爷,父亲,儿子)
c 类从b类继承,b类从a类继承
那么c类就拥有a类和b类的所有属性和方法
子类拥有父类以及父类的父类中封装的所有属性和方法
Cat类是Animal类的子类,Animal类是Cat类的父类,Cat从Animal类继承
Cat类是Animal类的派生类,Animal类是Cat类的基类,Cat类从Animal类派生
重写父类方法
1- 覆盖父类的方法
2- 扩展父类的方法
初始化方法也是方法
多继承的特殊情况
私有属性和私有方法
1.子类对象不能在自己的方法内部,直接访问父类的私有属性和私有方法
2.子类对象可以通过父类的公有方法间接访问到私有属性或私有方法
私有属性,私有方法是对象的隐私,不对外公开,外界以及子类都不能直接访问
私有属性,私有方法常用做一些内部的事情
子类访问父类的私有属性和方法
新式类和旧式(经典)类:
object是Python为所有对象提供的基类,提供有一些内置的属性和方法,可以使用dir函数查看
新式类:以object为基类的类,推荐使用
经典类:不以object为基类的类,不推荐使用
在python3.X中定义的类时,如果没有指定父类,会默认使用object作为基类--python3.x中定义的类都是新式类
在python2.x中定义类时,如果没有指定父类,则不会以object作为基类
推荐使用新式类
新式类和旧式类在多继承时---会影响到方法的搜索顺序
为保证编写的代码能够同时在python2.x和python3.x运行
今后在定义类时,如果没有父类,建议统一继承自object