在常见的编程范式里面有两种比较常用的,一种是函数式编程、一种是面向对象, 面向对象是一个非常大的话题,笔者不敢乱言, 本文只是面向对象一些概念的理解,然后聊聊复用这回事
广义上类的组成
在之前的文章中函数介绍中提过,函数是一个控制抽象,同时也提到面向对象是数据抽象, 其实从上面我们可以看出, 跟函数比, 面向对象中会多出一个数据成员, 而程序成员的意义,其实就是我们平时所说的方法, 但这里的成员的概念是指可能户包含多个函数
对象的生命周期
请
生命周期是一个很容易理解的概念, 对象就同人一样,出生、为梦想奋斗、死亡, 但与人不同的是,程序员可以在对象的创建、销毁时按照意愿来进行一些处理,而人不能
公用和私用成员
请
公用和私用,其实代表的是数据成员对外部的可见性,公用成员表示可以被其他对象直接访问,私用则表示只能通过其他方式间接影响
python中并没有类似其他语言private这种语言层的实现,而是通过下划线来进行约定,但就像人犯罪一样,你如果非要修改只要知道它的规则,就直接可以修改
面向对象这件事
Python是一门简单的语言, 甚至我们看一些书籍上,都明确指出在python中,脚本语言的特性、特有的语法糖和各种库等特性,弱化了一些设计模式上的东西,可你真的思考过面向对象这件事么?难道我们就只知道一个类?
复用
很多人学习面向对象,通常接触的就是面向对象的三大特性:封装、继承、多态, 可很少有人先提复用,我们今天说说复用这件事
接口
接口:对象操作所定义的所有操作型构的集合被称为该对象的接口型构:对象的每一个操作指定操作吗、参数和返回值
Python中并没有接口,但python是弱类型语言,所以只要我们传递的对象,实现对应的接口,并不需要具体的声明, 可以直接使用也不需要做额外的声明
复用的分类
复用的方式主要分为两种:组合和继承
类继承:允许根据其他类的实现定义一个类的实现,这种通过生成子类的复用通常称为白箱复用组合继承:新的更复杂的功能可以通过组装或者组合对象来获得,对象组合要求被组合的对象具有良好定义的接口,这种复用风格称为黑箱复用
黑白箱概念可能不容易理解, 其实主要是依据可视性(可见) , 比如在继承中,父类的内部细节怼子类完全可见,这是不是破坏了封装性?
类继承的特点
优点:
编译时静态定义,直接使用方便的改变被复用的实现,当一个子类重定义一些而不是全部操作时,它也能影响它所继承的操作,只要在这些操作中定义了被重定义的操作
缺点:
无法在运行时改变从父类继承的实现父类通常至少定义了部分子类的具体表示(因为继承对子类揭示了其父类的实现细节,继承通常被认为破坏了封装性)子类中的实现与父类紧密依赖,以至于父类实现中的任何变化必然导致子类发生变化当需要复用子类时,实现上的依赖就会产生一些问题,如果继承下来的实现不适合解决新的问题,则父类必须充血或者被其他更合适的类替换依赖关系限制了灵活性并最重限制了复用性可用的解决办法救市只继承抽象类,因为抽象类通常提供较少的实现组合的特点
优点:
对象指南通过接口访问,并不破坏封装下只要类型一致,运行时可用用一个对象来替换领一个对象对象实现基于接口,实现上存在较少的依赖保持每个类被封装,并被击中在单个任务上,这样类和类继承层次会保持在较小的规模基于对象组合时机会有更多的对象(较少的类),且系统的行为将依赖于对象间的关系而不被定义在某个类中学习面向对象这件事
有限使用对象组合,而不是类继承,这句话说这容易做着真的好难,本文的大部分内容是读设计模式书总结而来,不要走捷径,你连个对象都没明白,继承和组合,这种最基本的概念都不知道,上来就给你讲SOLID、设计模式,不是作者疯了,就是你疯了