• Python进阶_面向对象(类与实例)


      上一节将到面对对象必须先抽象模型,之后直接利用模型。这一节我们来具体理解一下这句话的意思。

      面对对象最重要的概念就是类(class)和实例(instance),必须牢记类是抽象的模板,比如student类,而实例是根据类创建出来的一个个具体的‘对象’,每个对象拥有相同的方法,但各自的数据可能不同。

    一.类的创建和实例化

    在python中,类是通过class关键字创建的

    1 class Student():
    2     pass

    class后面紧接着是类名,即Student,类名通常是大写开头的单词。关键字pass起到占位符的作用。

    定义好类之后可以通过类来创建实例

    p1=Student()

    print(Student)
    print(p1)
    
    ###输出结果
    #<class '__main__.Student'>
    #<__main__.Student object at 0x013BD430>

    Student本身是一个类。p1是Student的一个实例,0x013BD430是类的地址。创建实例是通过类名+()实现的。

    创建类的时候,我们可以把类具有的属性添加进去,例如Student具有的属性name和score。

    class Student():
        def __init__(self,name,score):
            self.name=name
            self.score=score
    #注意__init__是双下划线开始和结束的,这是Python中一个特殊的魔术方法,魔术方法以后会介绍

    注意:__init__方法的第一个函数永远是self,它表示创建的实力本身,因此__init__方法内部就可以吧各种属性绑定到self,因为self就是实例本身。name是一般的参数,self.name=name是将name变为实例的属性。有了__init__方法,在创建实例传参的时候必须要跟__init__参数匹配,但是self不用传参,python解释器自己会将实例变量传进去。

    p1=Student('方方','91')

    传参的原理是这样的p1=Student.__init__(p1,'方方','91')。__init__是一种特殊的方法,在实例创建的时候是自动调用的,这相当于在一个小孩儿没出生前就给小孩起名字是一样的,主要是防止以后利用这些属性的时候而没有这些属性。

    我们可以查看这些属性

    print(p1.name)
    print(p1.score)
    ##输出
    #方方
    #91

    我们还可以在类中定义其他方法

    class Student():
        def __init__(self,name,score):
            self.name=name
            self.score=score
        def get_name(self):
            return self.name
        def get_score(self):
            return self.score
    p1=Student('方方','91')
    print(p1.get_name())
    print(p1.get_score())

    细心观察我们会发现,类中调用的函数第一个参数是self,到用时不用传参(python解释器自己会将实例变量传进去),除此之外,类的方法和普通函数没有任何区别。

    二.数据封装

      面向对象编程的一个重要特点就是数据封装。在上面的Student类中,每个实例就拥有各自的namescore这些数据。既然Student实例本身就拥有这些数据,要访问这些数据,就没有必要从外面的函数去访问,可以直接在Student类的内部定义访问数据的函数,这样,就把“数据”给封装起来了。这些封装数据的函数是和Student类本身是关联起来的,我们称之为类的方法:

    class Student():
        def __init__(self,name,score):
            self.name=name
            self.score=score
        def get_name(self):
            return self.name
        def get_score(self):
            return self.score
    p1=Student('方方','91')
    print(p1.get_name())
    print(p1.get_score())

    我们来看一下内部结构:

    这样一来,我们从外部看Student类,就只需要知道,创建实例需要给出namescore,而如何打印,都是在Student类的内部定义的,这些数据和逻辑被“封装”起来了,调用很容易,但却不用知道内部实现的细节。

    小结:

      1.类是创建实例的模板,而实例是一个个具体的对象,各个实例拥有数据都互相独立,互不影响

      2.方法就是与实例绑定的函数,和普通函数不同,方法可以直接访问实例的数据

      3.通过在实例上调用方法,我们就直接操作了对象内部的数据,但无需知道方法内部的实现细节

      4.和静态语言不同,Python允许对实例变量绑定任何数据,也就是说,对于两个实例变量,虽然它们都是同一个类的不同实例,但拥有的变量名称都可能不同

  • 相关阅读:
    正则表达式学习《一》
    vs2008添加模板方法
    MongoDB学习笔记《二》
    oracle存储过程错误分析
    最近一个星期的学习,比较杂乱
    C#中的委托和事件
    c++随机数字
    Delphi中的接口
    C# 泛型
    LoadString、LoadIcon和LoadCursor函数
  • 原文地址:https://www.cnblogs.com/fangfang31140519/p/8637885.html
Copyright © 2020-2023  润新知