欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

面向对象知识点

程序员文章站 2022-07-12 15:37:47
...

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

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

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