面向对象知识点

面对对象编程(程序思想)

面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。

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变量,所以不能用这样的变量名。

posted @ 2019-06-23 22:17  wanjiang  阅读(163)  评论(0编辑  收藏  举报