思想

面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。

举一个简单的例子,大家都会下五子棋,我们就以开发一个五子棋的游戏来讲解面向过程和面向对象最本质的区别,在早期以面向过程为主要开发方法时,我们是这样来设计这个游戏的:

1) 开始游戏
2) 黑方出子
3) 绘制画面
4) 判断胜负
5) 白方出子
6) 绘制画面
7) 判断胜负
8) 循环2、3、4、5、6、7步
9) 输出结果
最后将每一个步骤作为一个处理函数开发出来,每次运行都调用一遍函数(或者过程)。面向过程最关键的概念就是“过程”,所以程序运行都是一步接一步,从上往下。

而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为:

1) 黑白双方:负责出子和悔棋
2) 棋盘系统:负责绘制画面
3) 规则系统:负责判定诸如犯规、输赢等
4) 输入输出系统:负责接收黑白子放的位置信息和输出游戏过程中的相关信息
这就是面向对象,更强调将程序模块化,我们甚至可以将该程序抽象出来使其适用于五子棋和围棋(它们除了规则不一样以外没有其它区别,那么我们只需要修改规则系统便可轻易支持围棋)。

类,实例和对象

何谓’类’

类(Class),即一类东西
如’草’是一类东西,’鸟’也是一类东西
‘类’是抽象概念

实例

实例(Instance),即某个’类’中的具体的某个,如’张三家的布谷鸟’属于一个实例,’李华花园里的含羞草’也属于一个实例

对象

‘一切皆是对象’,包括类,实例,变量,等等都可以视为对象

python面向对象

例:
现有三人,分别是张三、小明、李华
则,“人”是类;张三,小明,李华是具体的对象

定义一个类,使用class函数:

class Human(object):
    def __init__(self,name,birth,sex,weight):
        self.name = name
        self.birth = birth
        self.sex = sex
        self.weight = weight
    #↑定义类并绑定属性
    def say(self,word):
        print(f'{self.name} is human and can speak:{word}')
    #↑数据封装,称为‘类的方法’

解释&注意:

  1. __init__前后是双下划线
  2. (object)表示继承object类
  3. 括号里第一位的self相当于固定写法,代表所创建的实例本身
  4. self后的name,birth,sex,weight是变量,需要传入值,相当于Human这个类的实例原本就所具有的,且必须有的属性
  5. __init__内部的self.name = name等,作用是把各种属性绑定到self
  6. def say(self)的作用是为Human定义一个‘方法’,方法的内容即后面的代码。除了第一个参数是self之外,其他和定义一个函数一样,要调用一个方法,只需要在实例变量上直接调用,除了self不用传递,其他参数正常传入。

现在,已经完成了Human类的定义,接下来要为类创建实例

zhangsan = Human('张三', 20990101,'man',6)
#这表示`zhangsan`是一个`Human`实例,`name`是‘张三’ `birth`是20990101, `sex` 是‘man’,`weight`为6
zhangsan.say('hi!')#调用 类的方法,其中为`word`传入的参数为`hi!`
print(zhangsan.name)
print(zhangsan.sex)

以上代码(包括定义类)的输出为:

zhangsan is human and can speak:hi!
zhangsan
man

小结&参见

类是创建实例的模板,而实例则是一个一个具体的对象,各个实例拥有的数据都互相独立,互不影响;
方法就是与实例绑定的函数,和普通函数不同,方法可以直接访问实例的数据;

参见:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017495723838528
https://zhuanlan.zhihu.com/p/31251011

没有对象怎么面向对象