面向对象知识点
面对对象编程(程序思想)
面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。
OOP 把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数,而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。
class:类
类具有属性(Property),属性的查找顺序应该首先从对象自身寻找(类外)再从类中的属性绑定中(init)查找,找不到即报错
给对象发消息实际上就是调用对象对应的关联函数,我们称之为对象的方法(Method)。
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))
bart = student('bart simpson',59)
lisa =student('lisa simpson',87)
bart.print_score()
lisa.print_score()
类(Class)和实例(Instance)的概念是很自然的。Class 是一种抽象概念,比如我们定义的 Class—Student,是指学生这个概念,而实例(Instance)则是一个个具体的 Student,比如,Bart Simpson 和 Lisa Simpson 是两个具体的 Student。
数据封装、继承和多态是面对对象的三大特点
定义
#定义类是通过class关键
class Student(object): #Student类名形式一般以驼峰体为主
#如果无合适的继承类,就是用object类(所有类最终都会继承)
def __init__(self,name,score)
self.name = name
self.score = score
#注意到__init__方法的第一个参数永远是 self,表示创建的实例本 身,因此,在__init__方法内部,就可以把各种属性绑定到 self, 因为 self就指向创建的实例本身。
def print_score(self): #方法这其实就是在数据封装
print('%s:%s'%(self.name,self.score))
def get_grade(self):
if self.score > 90:
print('A')
elif self.score > 60:
print('B')
else:
print('C')
a = Student('wangqiang',98)
print(a.name) #wangqiang
print(a.score) #98
a.print_score() #wangqiang:98
a.get_grade() #A
#特别:
class Student(object):
name = 'cloud'
def __init__(self,name,score):
name = 'c'
self.name = name
self.score = score
def print_score(self):
print('%s:%s'%(self.name,self.score))
a = Student('a',98)
print(a.name) # ‘c’
类是创建实例的模板,而实例则是一个一个具体的对象,各个实例拥有的数据都互相独立,互不影响
访问限制
class Student(object):
def __init__(self,name,score):
self.__name = name
self.__score = score
def get_name(self):
print(self.__name)
a = Student('wangqiang',98)
print(a.score) #98
a.score = 89
print(a.score) #89(外部修改内部属性)
#从前面 Student 类的定义来看,外部代码还是可以自由地修改一个实例的 name、score 属性
#把属性的名称前加上两个下划线__,在 Python 中,实例的变量名如果以__开头,就变成了一个私有变量private),只有内部可以访问,外部不能访问。这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮。
def get_score(self):
print(self.__score)
a = Student('wangqiang',98)
print(a.score) #AttributeError: 'Student' object has no attribute '__name'
a.get_score() #只能通过类内部get_score获取具体属性
#如果又要允许外部代码修改 score 怎么办?可以再给 Student 类增加set_score 方法:
def set_score(self,score):
self.__score = score
a = Student('wangqiang',98)
a.get_score() #98
a.set_score(89)
a.get_score() #89(内部中修改内部属性)
#与从外部修改内部属性相比,因为在方法中,可以对参数做检查,避免传入无效的参数:
注意:在Python中,变量名类似__xxx__的,也就是以双下划线开头,并以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以不能用这样的变量名。