目录 面对对象编程(程序思想) class:类 instance:实例 定义 访问限制 面对对象编程(程序思想) ? 面向过程的程序设计 把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为
目录
- 面对对象编程(程序思想)
- class:类
- instance:实例
- 定义
- 访问限制
面对对象编程(程序思想)
? 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。
? 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变量,所以不能用这样的变量名。