三种编程方法论
- 面向过程:把复杂的任务一步一步分解成简单的任务。
- 函数式编程:思想上接近于数学运算,根据某种方式,根据方式得出的结果。
- 面向对象编程:一种编程方式,需要使用“类”和“对象”来实现,其实就是对“类”和“对象的”使用
软件质量属性
软件质量属性包含:成本,性能,可靠性,安全性,可维护性,可移植性,可伸缩性,可扩展性等
面向过程
- 概念:核心是“过程”二字,“过程”指的是解决问题的步骤,即先干什么再干什么......,把这个大的问题分解成很多个小问题或子过程,这些子过程在执行的过程中继续分解,直到小问题足够简单到可以在一个小步骤范围内解决。
- 优点:复杂的问题流程化,进而简单化
- 缺点:扩展性极差
- 应用场景:一般用于那些功能一旦实现之后就很少需要改变的场景, 如果你只是写一些简单的脚本,去做一些一次性任务,用面向过程的方式是极好的,著名的例子有Linux內核,git,以及Apache HTTP Server等。但如果你要处理的任务是复杂的,且需要不断迭代和维护 的, 那还是用面向对象最方便了。
面向对象编程
- 概念:核心是“对象”二字,对象就是特征与技能的结合体。
- 优点:可扩展性高
- 缺点:编程的复杂度高,易出现过度设计的问题
- 应用场景:应用于需求经常变化的软件中,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方。
一、名词解释
- 类:一个类即是对一类拥有相同属性的对象的抽象、蓝图、原型、模板。在类中定义了这些对象的都具备的属性(variables(data))、共同的方法
- 属性:人类包含很多特征,把这些特征用程序来描述的话,叫做属性,比如年龄、身高、性别、姓名等都叫做属性,一个类中,可以有多个属性
- 方法:人类不止有身高、年龄、性别这些属性,还能做好多事情,比如说话、走路、吃饭等,相比较于属性是名词,说话、走路是动词,这些动词用程序来描述就叫做方法。
- 实例(对象):一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性,就像人类是指所有人,每个人是指具体的对象,人与人之前有共性,亦有不同
- 实例化:把一个类转变为一个对象的过程就叫实例化 就是类名+括号,就是在执行类的__init__()方法
- 构造方法:__init__(...)被称为 构造方法或初始化方法,在例实例化过程中自动执行,目的是初始化实例的一些属性。每个实例通过__init__初始化的属性都是独有的
- 析构方法(解构方法):__del__(self)被称为 析构方法或解构方法,实例在内存中被删除时,会自动执行这个方法。
二、类和对象
- 类中可以有任意python代码,这些代码在类定义阶段便会执行
- 因而会产生新的名称空间,用来存放类的变量名与函数名,可以通过 类名.__dict__查看
- 对于经典类来说我们可以通过该字典操作类名称空间的名字(新式类有限制),但python为我们提供专门的.语法
- 点是访问属性的语法,类中定义的名字,都是类的属性
- isinstance(obj,cls)检查obj是否是类 cls 的对象
- 类的两种用法:实例化和属性引用(类的属性就两种:变量和函数)
- 对象也叫实例只有一种用法:属性引用,就对象本身而言它只有数据属性
- 构造函数中的self表示创建的当前对象。方法中的self表示谁调用的方法,self就是谁。
- 示例对象访问属性或调用方法时,永远都是先找自己的,找不到就往父类找。
类中调用属性
三、__init__方法
- 为对象初始化自己独有的特征
- 该方法内可以有任意的python代码
- 一定不能有返回值*****
四、属性查找
在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常
- 类有两种属性:数据属性和函数属性
- 类的数据属性是所有对象共享的
- 类的函数属性是绑定给对象用的
五、特性1:封装
封装在于明确区分内外, 类的实现者不需要让类的调用者知道具体的实现过程,隔离了复杂度,同时也提升了安全性,类的实现者可以修改封装内的东西而不影响外部调用者的代码。
在面向对象思想中是把一些看似无关紧要的内容组合到一起,统一进行存储和使用,这就是封装。
1、构造方法和类本身的包裹
使用构造方法将属性封装到某个具体对象中,然后通过对象直接或者self间接获取被封装的属性,类本身就是一种封装的体现,它将数据与专门操作该数据的功能整合到一起。
2、__双下划线属性隐藏
- 在python中用双下划线开头的方式将属性隐藏起来,设置成私有的
- 类中所有双下划线开头的名称如__x都会在类定义时自动变形成:_类名__x的形式
- 变形的过程只在类的定义时发生一次,在定义后的赋值操作,不会变形
- 在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的
3、装饰器@property也有封装的思想
- @property 类的静态属性:
- 将一个类的函数定义成特性以后,对象再去使用的时候obj.mbi,根本无法察觉自己的mbi是执行了一个函数然后计算出来的,
- @property这种特性的使用方式遵循了统一访问的原则
- @classmethod
- 把一个方法绑定给类,会把类本身当做第一个参数自动传给绑定到类的方法
- 类的绑定方法
- @staticmethod
- 被staticmethod装饰器修饰过的方法,都是解除绑定的方法,实际上就函数:就没有自动传值功能了
- 解除绑定的方法
- 凡是定义在类的内部,并且没有被任何装饰器修饰过的方法,都是绑定方法:有自动传值功能