面向过程编程
关键在于过程
过程指的是,想干啥,再干啥,最后干啥,是完成某个任务的具体步骤
注意:面向过程与函数编程是完全不同的
优点:将复杂的问题拆分为若干个简单问题,然后按照顺序一步一步完成
从而使得问题,简单化,流程化
缺点:由于代码严格按照顺序编写,导致拓展性极差
类似一条流水线 一旦涉及完成就只能完成某种固定的任务
后期如果需要修改需求 需要重新设计
使用场景:对拓展性要求较低的应用程序
例如:操作系统内核,运维工程师编写的shell脚本
面向对象编程
是一种编程思想
关键在于对象,对象是一系列特征和行为的结合体
使用面向对象来编写程序时,需要将程序员自身看作是上帝,不是去思考具体的实现步骤
重点关注的是什么样的对象可以完成这个事情
面向过程想的是:怎么做
面向对象想的是:谁来做
优点:拓展性高,修改单独某一个对象,不会影响到其他对象
复用性,灵活性,降低耦合度
缺点:相对于面向过程而言,编程的复杂度提高了
衡量一款软件质量的指标有很多:扩展性,可用性,易用性,成本等等
无法准确预知执行结果
使用场景:
对拓展性要求较高的应用程序,比如QQ,一直在加功能。(直接面向用户的应用程序拓展性要求都高)
类:
类型 类别 分类
类是一堆对象 相似的特征和相似的行为的结合体,是一种抽象概念
类和对象的关系:
生活中,先有对象,再有了类
程序中,先有类,再由类产生对象
可以把类当成是一个对象的模板,或者说是对象的工厂。负责产生对象
定义一个类时:
1.定义一个名称空间
2.执行类中代码,将产生的名称存储到名称空间中
3.将类名称与名称空间绑定
类名的命名规范是 大驼峰 所有单词首字母大写
产生对象:
类中只存储相同的特征和行为
在面向对象中 特征和行为都统称为属性
调用类产生一个对象:
stu1 = Student("name","sex")
默认情况下,对象的名称空间是空的,通过点可以增加属性,但是一般不推荐使用这种方法
初始化函数
在类中使用__init__(self,name,age):
self.name = name
self.age = age
使用传参的方式来增加属性可以节省代码
self指的是对象本身 谁调用了self,self就是谁
不推荐在对象产生狗为其增加属性,可能会报错
属性的查找顺序:
对象既可以访问自己名称空间中的内容,也能访问类中的内容
如果出现相同的,优先访问自己名称空间中的
顺序: 对象->类
不同的对象名称空间是相互独立的
类中的属性被所有对象共享
类的绑定方法:
方法指的就是函数
本质就是将函数和对象进行了绑定
对象本质就是一个数据容器 里面存储了多个属性
函数是用于处理数据的代码段
对象的精髓就是 将数据和处理数据的代码段进行绑定
绑定方法的好处是 只要拿到了对象 就同时拿到了要处理的数据,以及处理数据的方法
通常情况下 类中的大多数函数都是绑定给对象的方法 因为这些函数需要使用到对象中包含的数据
默认情况下 类中的方法都是绑定给对象的
类中的方法 分为两类
1.绑定方法
1.1对象的绑定方法 (默认)
1.2类的绑定方法
语法:使用@classmethod装饰器
使用场景:当一个方法的执行逻辑中需要访问类中的属性时,就应该作为类的绑定方法
2.非绑定方法
语法: 给方法加上 staticmethod装饰器
使用场景 当一个方法的执行逻辑中不需要访问对象中也不需要访问类中的数据时
就应该定义为非绑定方法
场景总结:
如果这个方法需要访问对象中的数据 那就作为 对象绑定方法(默认)
如果这个方法需要访问类中的数据 那就作为 类绑定方法(@classmethod)
如果这个方法不需要访问类和对象中的数据 那就作为 非绑定方法(@staticmethod)