面向对象编程---Object Oriented Programming,简称OOP,是一种程序设计思想.
OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数.
面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行.为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数切分为小块函数来降低系统的复杂度.
面向对象的程序设计把计算机程序看做一组对象的集合,而每个对象都可以接受其他对象发送过来的消息,并处理这些消息,计算机程序的执行像是一系列的消息在这些对象之间传递
在Python中所有的数据类型都可以看做是对象,当然也可以自定义对象.自定义的对象数据类型就是面向对象中的class(类)的概念
面向过程和面向对象处理的区别
# 面向过程
std1 = {'name' : 'djw', 'score' : 66}
std2 = {'name' : 'lmf', 'score' : 88}
def print_score(std): # 处理成绩的过程可以用一个函数来表示
print('%s got %s' % (std['name'], std['score']))
# 面向对象
# Students这种数据类型应该被称为一个对象,这个对象有name和score两个属性(Property),如果要打印学生的成绩,必须首先创建出这个学生对应的对象,然后,给对象发一个print_score的消息,让对象把自己的消息打印出来
class Students(object):
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print('%s : %s' % (self.name, self.score))
给对象发消息实际上就是调动对象对应的关联函数,我们称之为对象的方法(Method),对象的调用
djw = Students('Duan jw', 66)
lmf = Students('LI mf', 88)
djw.print_score()
lmf.print_score()
面向对象的思想是从自然界中抽象出来的.在自然界,类(Class)和实例(instance)都是很常见的,Class是一种抽象的概念,比如我们定义的Students,而实例instance则是一个个具体的student,比如djw和lmf
所以面向对象的思想是:抽象出Class,根据Class创建Instance
面向对象的抽象程度要比函数高,因为一个Class既包含数据,又包含操作数据的方法
继承 封装 多态是面向对象的3大特点
类和实例
面向对象最重要的概念就是类(Class)和实例(Instance),类是抽象的模板,比如Students类,而实例是根据类创建出来的一个个具体的'对象',每个对象都具有相同的方法,但是各自的数据可能不同
仍以Studens为例子,在Python中,定义类是通过class关键词来的:
class Students(object):
pass
class后面紧接着的是类名,即Students,类名通常是大写字母开头的单词,紧接着的是(object),表示该类是从那里继承下来的,如果没有合适继承的类,就使用object类,这是所有的类最后都会继承的类
定义好Students类之后,就可以根据Students类创建出Students的实例,,创建实例是通过类名+()来实现的,后面的是内存地址
我们可以自由的给一个变量绑定属性 djw.sex = 'boy'
由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制添加进去,通过定义一个特殊的方法init方法 注意init前后都是两个下划线
注意到init的第一个参数永远是self,表示创建的实例本身,因此在init内部就可以把各种属性绑定到self,因为self就指向创建的实例本身
有了init方法,在创建实例的时候,就不能传入空的参数了,必须传入与init方法匹配的参数,但self不需要传,Python解释器自己会吧实例变量传进去
和普通的函数相比,在类中定义的函数只有一个不同点,就是第一个参数永远是实例变量self,并且调用的时候,不用传该参数,除此之外,类的方法和普通的函数没有什么不同,所以,你仍然可以用默认参数, 可变参数 关键字参数 命名关键字参数
数据封装
我们可以直接在类的内部定义访问数据的函数,这样就把'数据'给封装起来了,称之为类的方法
要定一个方法,除了第一个参数默认是self之外,其他和普通的函数一样,要调用一个方法,只需要再实例变量上直接调用,除了self不用传入,其他的参数正常传入
数据和逻辑被封装起来了,调用很容易,而且不需要知道其内部的细节
小结
类是创建实例的模板,而实例则是一个一个具体的对象,各个实例拥有的数据都互相独立,互不影响.
方法就是与实例绑定的函数,与普通函数不同的是,方法可以直接访问实例的数据
与静态语言不同,Python允许对实例变量绑定任何数据,也就是说,对于两个实例变量,虽然他们都是同一个类的不同实例,但是拥有的变量都可能不同 |