面向对象编程(Object Oriented Programming,OOP),是一种程序设计思想,把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。面向过程的程序设计把计算机程序视为一系列命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。而面向对象的程序设计把计算机程序视为一组对象集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。
那面向对象编程与面向过程编程到底有什么区别?通过一个例子进行比较:
#面向过程
stu1 = {"name":"aaa","score":90}
stu2 = {"name":"bbb","score":85}
def print_score(stu):
print("%s: %s" %(stu["name"],stu["score"]))
print_score(stu1) #aaa: 90
print_score(stu2) #bbb: 85
------------这是分界线-----------------
#面向对象,面向对象的设计思想是抽象出class,根据class创建instance
class Student(object):
#实例属性
def __init__(self,name,score):
self.name = name
self.score = score
#实例方法
def print_score(self):
print("%s: %s" %(self.name,self.score))
stu1 = Student("aaa",90) #创建实例stu1
stu2 = Student("bbb",85) #创建实例stu2
stu1.print_score() #调用方法,输出aaa: 90
stu2.print_score() #调用方法,输出bbb: 85
1.类和实例
面向对象最重要的概念就是类(class)和实例(instance),类是抽象的模板,如上述Student类,而实例是根据类创建出来的一个个具体“对象”,如上述stu1对象。
#Python类定义格式
class Classname(object):
psss
#说明:class关键字定义类,后面紧接类名(类名通常首字母大写),紧接着为(object),表该类是从哪个类继承下来的。如果没有合适的继承类,就用object类,这是所有类最终都会继承的类。
#Python实例
instancename = Classname() #创建了实例instancename,创建实例通过类名+()实现
__init__
class Student(object):
#实例属性
#__init__()叫做初始化方法(构造方法),在类被调用时,这个方法会自动执行,进行一些初始化动作。
def __init__(self,name,score):
self.name = name
self.score = score
#实例方法
def print_score(self):
print("%s: %s" %(self.name,self.score))
#析构方法,在实例释放、销毁的时候自动执行,通常用于做一些收尾工作。这个方法可选,不是必须写
def __del__(self):
print("这里是析构函数,结束啦!")
stu1 = Student("张三",90)#生成一个角色,会自动把参数传给Student下面的__init__()方法,此时相当于Student(stu1,"张三",90)
stu1.print_score()#此时相当于Student.print_score(stu1)
注意到__init__
方法的第一个参数永远是self
,表示创建的实例本身,因此,在__init__
方法内部,就可以把各种属性绑定到self
,因为self
就指向创建的实例本身。有了__init__
方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__
方法匹配的参数,但self
不需要传,Python解释器自己会把实例变量传进去:
stu1 = Student("aaa",90) #实例stu1
print(stu1.name) #aaa
print(stu1.score) #90
和普通的函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self
,并且,调用时,不用传递该参数。除此之外,类的方法和普通函数没有什么区别!
2.访问限制
class Student(object):
def __init__(self,name,score):
self.name = name
self.score = score
def print_score(self):
print('%s: %s' %(self.name,self.score))
s1 = Student('zhangsan',90)
print(s1.name)#打印实例名称,这里输出为zhangsan
print(s1.score)#打印实例成绩,这里输出为90
s1.score = 100 #在类外部,我们修改实例属性
print(s1.score)#打印输出为修改后的100
通过上述代码可以发现,类虽然隐藏了内部的复杂逻辑,但是其内部属性可以被外部代码任意修改其属性,有没有什么方法可以不让外部代码修改呢?在Python中,实例变量名如果以 __ 开头,就变成了一个私有变量,只有内部可以访问,外部不能访问,所以,上述代码可以这么修改:
class Student(object):
def __init__(self,name,score):
self.__name = name #原self.name修改为self.__name
self.__score = score #原self.score修改为self.__score
def print_score(self):
print('%s: %s'