前言
面向对象编程就是如何用类进行编程。
1、什么是编程
编程是把人的语言转换成计算机能明白的指令。
2、什么是类
类是把一类实际对象抽象化,关注共有的属性特征,而不是某个对象具体属性特征。
3、类与类之间关系
面向对象编程是以类作为最小编程单位,根据工作流程,设计类与类相互的关系最终实现程序功能。如何相互协作,就要理解类与类之间关系。
类与类之间有多少个关系这不重要,这里仅仅列常见的关系。
应该来说,类该怎么定义,每个人都有自己理解,类之间关系也是多种多样,同样的项目不同人编写类和实现方法不尽相同。不要生搬硬套,重视理解,而不要关注细节。
序号 | 关系名称 | 定义 | 编码表示 |
---|---|---|---|
关联关系 | A类与B类存在一定的关系,关系可以是具体下面四种 | 关注A与B类的对象之间数量和关联方向。 | |
1 | 依赖关系 | A类依靠B类完成工作 | 在A的方法中把B类作为一个参数 |
2 | 聚合关系 | B类是A类一个,A类是多个B类的集合 | B类作为A类属性,数量不确定 |
3 | 组合关系 | B类是A类一部分,B类不单独存在 | B类作为A类属性,数量确定 |
4 | 泛化关系 | A类和B类存在父子关系也叫继承关系 | B类有A类属性和方法,是继承 |
这个是经典例子,学不会类之间关系可以尝试去画。
3.1对象与对象协作
类是蓝图是抽象的,对象是类的具体实例。在落地编码中由类产生对象,通过对象之间相互协作最终实现程序功能。如何协作,在类定义已经确定下来,并不是对象来决定。
对象只关心另外一个对象有什么功能,而不关心具体如何实现。 对象只会通过调用另外一个对象方法,实现功能。不参与另外一个对象具体实现。 对象如何与另外一个对象工作,在类的设计过程中,类与类关系已经确定下来。
# 类与类关系依赖关系
class Person:
def play(ball):
ball.action
class Football:
def action():
print('踢球')
# 通过类产生的对象,调用的对象方法具体实现编码
p = Person()
ball=Football()
p.paly(ball)
3.2、类封装
类是把与本类相关的数据和方法绑定一起。 我们熟悉的面向过程中,使用函数实现程序功能,我们发现函数把逻辑语句封装,相关数据没有封装。或者说数据和函数在编码上单独存在。 类封装设计,是在代码上按照对象与对象打交道方式把数据和逻辑隔开,相互不干扰。
类封装是很重要概念,是面向对象思想基础。面向过程转入面向对象,难点在于思想:
-
每个类都是把跟自己相关数据和跟自己相关的方法绑定。
不要把跟自己不相关加进来,包括不是自己层面的数据和方法,不要试图把跟自己不相关不应该处理的数据和方法放进来。 -
采用类封装一定是封装跟自己相关的,不要因为类的交互访问调用需求,而把某个类属性定义为调用的类的属性。类与类之间交互,是通过类曝露出来方法给其他类调用,访问属性也是通过类的方法。
-
类与类之间,包括各自的数据和方法和功能逻辑,相互之间不知道。所以每个类方法的内部逻辑是完整,调用A类时候,不依靠调用其他类来帮助A类完成A的功能。这里表达的意思,你找我办事,我还需要谁帮忙,你不需要知道细节,那是我的事情。
举例当A类要引入B类是用B类,有数据是在A类和B类反复流转的:如果在A类定义为属性,我们需要传参数形式让B类调用。这里问题是定义一个A类相关不大属性,而且只是为了调用B类,那么你会发现A类是主类时候会引入越来越多属性。这里解决办法是跟B类相关反复用的数据,定义为B类属性。
3.3、面向对象和面向过程并不是对立
在整体编程上通过使用类封装代码,对象协作,按照流程步骤完成,就是采用了面向对象编码方式。
在整体编程上通过函数协作,按照流程步骤完成,就是采用了面向过程编码方式。
不管是对象协作完成,还是函数协作完成,最后按照流程流程步骤,具体代码都是面向过程方式。面向对象看起来就像加了类封装的面向过程。
3.4、 没有用面向对象思维编码都是假的面向对象编码
如果仅仅采取类封装,没有在类定义和类与类关系抽象层面来设计整个程序,这是只是采用面向对象编码方式,不是真正面向对象。
一方面,类编程最重要遵守封装规范,编码过程是自上而下,一开始关注整体结构构建,实现宏观把控。
另外一方面具体编码实践,往往发现需要很多补充细节。
比如需要补充一些类;修改类属性和方法;类与类交互关系调整等等。都要遵守封装规范,约束代码规范编写。
总结
用类编程时,是在代码上按照把数据和逻辑隔开,相互不干扰,同时又能进行一定的协作,在各司其职的情况下,共同完成整个项目的实现。