面向对象的概述
面向对象是一种编程范式
范式可以定义为是一组方法论
编程范式就是一组如何组织代码的方法论
主流的编程范式:
- PP: 面向过程(C)
- IP: 面向指令(汇编)
- FP: 函数式编程(无副作用)
- LP: 面向逻辑的编程(把世界抽象为:与或非,prolog)
- OOP:面向对象的编程(Python)
- AOP:面向方面的编程(Python中的装饰器,sql语言)
Python属于OOP,所以主要介绍OOP编程
OOP的世界观:
- OOP的世界是由对象组成的
- 对象具有运动规律和内部状态
- 对象之间是可以相互作用的
OOP是目前人类的认知中,最接近真实世界的编程范式
OOP的特点:
- 唯一性:对象都是唯一的,不会存在两个相同的对象,除非他们是同一个对象
- 分类性:对象是可分类的,根据作用和特性,区分类别和子类别
OOP的三大特征:
- 封装:就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
- 继承:使用其他类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
- 多态性:将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。
Python的面向对象编程
提到面向对象,就要说下,class关键字了, 在现在所有的面向对象的编程语言中,基本上都有class这个关键字,class关键字是和面向对象息息相关的,但是在现在也有一些语言,已经开始不使用class关键字,但是它也是面向对象的编程语言,例如GO语言
使用命名元组,可以让我们更好的组织数据,让数据更规范,让字段有名字
In [1]: from collections import namedtuple
In [2]: Pet = namedtuple('Pet',['name', 'age'])
In [3]: person = Pet('lanyulei',18)
In [4]: person.name
Out[4]: 'lanyulei'
In [5]: person.age
Out[5]: 18
类的定义
使用class关键字定义一个类,例如定义一个门的类,有门牌号和门的状态
In [1]: class Door:
...: def __init__(self, number, status):
...: self.number = number
...: self.status = status
...:
In [2]: door = Door(1001, 'closed')
In [3]: door.number
Out[3]: 1001
In [4]: door.status
Out[4]: 'closed'
现在门的状态是关闭的,我们直接修改类的属性进行改变门的状态
In [5]: door.status = 'openning' # 这样门的状态就打开了
In [6]: door.status
Out[6]: 'openning'
通过上面的例子, 可以总结出:
- 创建类对象的时候使用类名(init 函数除第一个参数外的参数列表)
- 创建对象的时候,实际上是执行了__init__函数,这样的函数,也叫作构造函数
上面的例子中,在实例化类对象的时候,给类传递了两个参数,但是明显的 __init__函数是有三个参数的
这里就说下self
在类的__init__函数中, 第一个参数都是代表的类实例本身的
- init 本身是不会创建对象的
- init 函数会初始化对象
一个类的对象的创建过程
- 首先创建对象
- 然后对象作为self传递给__init__的第一个参数
- 然后返回self
这里声明,self只是一种Python编程中惯用的写法,self可以是任何字母组成的字符串来表示
定义一个类,在类中的函数,当第一个参数是self的时候,则这种函数可以叫做类的方法
In [7]: class Door:
...: def __init__(self, number, status):
...: self.number = number
...: self.status = status
...: def open(self): # 开门方法
...: self.status = 'openning'
...: def close(self): # 关门方法
...: self.status = 'closed'
...:
In [8]: door = Door(1001, 'openning')
In [9]: door.status
Out[9]: 'openning'
In [11]: door.close() # 当我们执行指定的方法的时候,就会调用方法中的代码块,并且,第一个参数会自动传入为对象本身
In [12]: door.status
Out[12]: 'closed'
注意self只能是位置参数,不能是其他类型的参数
上面的将的大概是围绕着这四个方面介绍的
- 如何定义类
- 如何创建对象并初始化对象
- 如何定义方法
- 方法调用