python学习笔记(13):类与对象

一、类

        类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起

       1.1定义类的关键字:class

       类的实例化:与其它语言不同,python不需要new关键字来实例化类,直接使用:变量名 = 类名()

       1.2 类的作用:封装代码

       1.3 类中的函数

       1.3.1 类中的函数要调用类中的变量时,函数中应添加参数self,否则会报错

            

        1.3.2   类的函数具体调用类中的变量时,要使用“self.变量名”的方式

修改后的代码执行:

        

           注:1.类只负责封装代码,不负责执行代码,若要执行类中的代码,应在类的外部调用执行

                 2.建议类的声明与实例化不要放在一个模块中

        1.4 方法:是设计层面的函数,类中定义的函数可以称做方法

             函数:面向过程的概念,直接定义在模块中函数可以叫做函数

             直接定义在模块中的变量,一般叫做变量

             定义在类中的变量,一般叫做数据成员

        1.5 类与对象

             类是一个抽象的概念,不具体;对象用于表示一个具体的概念,实例化将类具体为对象

             类相当于一个模板,可以实例化出各种不同的对象

二、构造函数

      2.1  def __init__():
                pass

 

        构造函数的调用是自动执行,当实例化对象时会自动执行构造函数

               

        注:构造函数可以有返回值,但是只能返回none,不可以返回任意值,如

修改后的代码:

        2.2 类变量与实例变量

                类变量与类相关,实例变量与实例相关,类的数据成员也叫做类变量,类使用“self.数据成员”来保存类变量的特征值,“self.数据成员”是类变量的实例对象,也叫实例变量

            注:1. self可以任意定义(也可以改为其他单词比如this等),所以self并不是关键字

                  2. 类变量是写在构造函数外面,实例变量是写在构造函数里面,通过“self.变量名 = 值”的方式存储,在赋值的时候进行存储

以下代码

其中sum1是类变量,name与age是实例变量

            在构造函数中,以下代码不会更改数据成员的值

        因为python中对象访问变量时,会先从实例变量中查拭,如果实例变量中查找不到就会从类变量中查找,如果类变量中还找不到就会从父类中查找,self本身就代表一个对象        

        更改后的代码:

                  

       2.3 self的特性

                1.python不同于其他语言,类似于this作用的self,需要显性的显示出来,类里面的方法在调用到类的数据成员时,方法中第一个参数必须是self

                2.对象在调用类中的方法时,不需要再传入self,在调用方法时,会默认传入self

                3.self也可以改为其他名字,比如this,所以self不是关键字

                4.self表示当前调用某一方法的对象,所以self只和对象有关,与类无关 

三、实例方法中访问实例变量与类变量

        实例方法的内部,不能直接调用类的数据成员,也不能直接调用类的方法,如:

3.1 使用“self.数据成员”的格式来访问

注:此时是有两个sum1变量,一个是类变量,一个是实例变量,可看以下代码

3.2 使用“类名.变量名”的格式访问

3.3 使用“self.__class__.变量名”的格式访问

3.4 注:“self.变量名”只是访问实例变量,只对实例变量进行操作,而后两种操作是对类变量进行操作,若操作更改了类变量的值,那么之后的对象访问此变量时,值也会更改,如:

        3.4.1 使用“self.变量名”进行访问:

             3.4.2 使用“类名.变量名”访问

             3.4.3 使用“self.__class__.变量名”访问

 

3.5 注意以下代码:通过类名更改了类变量的值,通过self访问的sum1也会变,但是打印出的__dict__却是空{}

注:这是因为self.变量在进行访问时,会先查找实例变量,如果实例变量没有找到则会去类变量中进行查找,如果类变量中找不到则去父类变量中查找,而以上代码并没有通过“self.sum1 = 值”的方式进行赋值与存储实例变量,所以此时self.sum1访问的是类变量,而不是实例变量

四、类方法

4.1 格式

    @classmethod

    def 方法名(参数列表):

        pass

4.2 作用:操作类变量

        注:类变量的值改变后,之后生成的对象,访问类变量会得到改变后的值

4.3 调用格式:类名.方法名()

示例:

注:1.类方法中的参数cls也可以改为self,但是建议采用python给出的建议,使用cls,来做以类方法的区分,cls是class的简称

2.类的外部,也可以使用对象来调用类方法,不会报错,但是建议仍使用“类名.方法名”的格式来调用类方法

使用对象来调用类方法,示例:

3.类的实例方法中虽然也可以对类变量进行操作,但是建议使用类方法来对类变量进行操作,可以使用代码更优雅

4.类方法中不能访问实例变量,会报错

五、静态方法

5.1 格式

        @staticmethod

         def 方法名(参数列表):

                pass

5.2 静态方法中可以访问类变量,不可以访问对象变量,参数列表不用输入self

注:静态方法中访问类变量时,只能通过“类名.变量名”的格式进行访问,使用self.__class__.变量名的格式访问类变量会报错,如图:

5.3静态方法的调用

5.3.1 对象名.方法名

5.3.2 对象名.方法名

注:1.静态方法建议不要经常使用,因为与类和对象的联系比较弱,除非认为这个方法是纯粹的,与类和对象都没有关系,可以使用静态方法

2.python中的类方法与其他语言的静态方法类似

 六、成员的可见性

6.1 成员的可见性分为:公开、私有

6.2 公开性:成员变量是公开性质,则在类的外部可以访问此变量,正常书写,默认的就是公开性质

      私有性:成员变量为私有性质时,则在类的外部不可以访问此变量,在变量名或方法名前面加双下划线,即可变为私有

6.2.1类变量设置为私有变量:

6.2.2实例变量设置为私有变量:

 

6.2.3方法设置为私有方法

      注:python和其他语言不同,没有public和private来规定此变量是公开的还是私有的,在变量名或方法名前面加两个双下划线,则此变量或方法则变为了私有性质,前后都加双下划线时,不是私有性质,如构造方法__init__(),及内置函数和内置变量

6.3 动态添加变量

.

以上代码不会报错,是因为student1.__score = -1动态的给student1添加了一个变量__score,而这个__score不是私有变量,只有在类的内部使用双下划线才会成为私有变量,如私有变量存储在__dict__的格式为“_Student__score”,而动态添加的变量在__dict__中存储的格式为“__score”

根据以上__dict__打印的内容,对象也可以访问私有变量,如:

注:没有什么是不可以访问的

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值