zoukankan      html  css  js  c++  java
  • 类的编码基础

    一。类对象: 

         1.概念:

         类是有层级(树状)的命名空间,实例对象的工厂,产生于class语句

         2. 特点;

             2.1 class语句创建类,并把类赋值给class后面的变量名

             2.2 class作用域为类属性提供命名空间,

             2.3 class语句内的赋值语句,创建类属性,这种类属性所有实例共享

                   def语句创建方法,方法用于处理实例对象

    二。实例对象:

         1. 概念:

         程序处理的实际对象,有独立的命名空间,产生于类的调用,每调用一次,就产生一个新的实例对象

         会继承产生该实例对象的类对象的变量名。

         2. 特点:

             2.1 类的调用,产生实例对象,

             2.2 每个实例对象都会继承类的属性,并有自己的独立命名空间

                   一开始是空的,但是会填写来自继承的类属性。

             2.3 类方法的调用,第一个参数是实例自己(self),用于区分不同实例,及定位实例的命名空间,

                  类方法的调用,会修改该实例命名空间内的数据,当然就不会修改类属性的数值了。

    三。第一个例子:

         

          

           

           

            

    四。类的继承和调用:

          

    五。第二个例子:

         

         

          继承的搜索会从实例往上走,到子类,到超类,secondclass的display方法覆盖了超类firstclass的display的方法,

          这种重新定义,重新取代属性的方式,叫重载

          这种定制化,重载是在firstclass外部(重新定义了一个子类)完成的,没有修改firstclass的原代码,之前的x,y实例的display不会受到影响

          因此类所支持的后期的扩展性和重用性比函数和模块要好和灵活

          

          

              

            

    六。 类是模块的属性:

          把类看成一个变量,模块内对变量的所有操作,基本都适用于类。

          

           

          

           因此,类的名字最好别和模块的名字一样,否则容易混淆,python里通常的做法是类名称第一字母大写

    七。类支持python的运算符计算:运算符重载

          加法,切片,打印,点号运算

          1.以双下划线命名的方法是特殊的钩子(运算符重载的标志):这类方法是用来支持运算符计算的方法,而且是有固定的映射规则

             例如:__add__对应“+”加法运算

                     __str__对应“print”的打印命令的调用

             如果class语句里面没有定义__add__方法,则直接调用类或实例做加法运算,会报错。

             __init__这个不是运算符重载,是比较特殊的一个方法,叫构造函数,主要用于实例的创建,可以立即给实例添加属性

             不必等到实例调用方法时,才往空白的实例命名空间里添加属性,你如果想了解某个类里的实例属性,可以去看__init__

          2. 当实例出现在内置运算表达式里,会自动调用这些方法,其返回值就是运算表达式的结果(通常是创建了一个新实例

          3. 类有几十种运算符重载的方法,基本能满足python里的常规计算表达式,具体需要了解,可以查手册

          4. 运算符重载方式,把类变成了python其他内置数据类型一样的通用,在接口调用等方面,非常便利

    八。第三个例子

         

         

          1. a=ThirdClass('abc'),类的调用,创建实例a,同时传参“abc”给__inti__方法,

              如果类里有__init__方法,在类调用,创建实例时,必须按__init__方法的要求传入参数,并在该实例创建时写入内容

              没有__init__方法的类,创建实例时,仅仅创建了该实例的命名空间,里面的是空的,等后期方法的调用,才会有写入

          2.b=a+'xyz':加号触发了__add__方法,传参规则如下:

             

        3. 需要注意的地方:

            

            

             以上方法,及实例化,实际是类的一次调用,创建了一个新的实例b,才会有以下的调用:

             

              这点和普通的 8=5+3概念一样,8是新创建出来的常量对象

    九。为什么要用运算符重载:

         1.数学对象里会大量的使用运算符重载

         2.其他情况下比较少用到,相对比较复杂,能不用就不用吧

             

    十。最简单的class:

            

          定义了一个空类

         

          以下动态创建类属性,实例属性

          

          类外动态定义了两个类的属性,为所有实例共享

         

          打印类属性的值

         

          创建实例

         

         显示实例的属性,相同的值说明继承于类属性,是共享的

        

         重新定义了x实例的name属性,覆盖了类属性的name,重载,x有了自己的实例属性

            

         

         以下动态创建方法:

         

       

         

    十一。命名空间对象和字典:

          类,实例的属性实际是以字典的模式呈现,类树里只是层次只是连接到不同字典

          1.查看类,实例有哪些属性,或者说这个命名空间字典里有哪些键:用__dict__.key属性查看

             

             

          2.查看实例连接着哪个类,以便于继承该类:__class__

             

           

          3.查看实例连接着哪个类,以便于继承该类:__bases__

             

             

    十二。类和字典的关系:

            

                 

                  

               

         

        

          

            

  • 相关阅读:
    高精度计算模板
    P1108 低价购买 [DP][统计方案]
    POJ3349 Snowflake Snow Snowflakes [哈希]
    P1312 Mayan游戏 [深搜][模拟]
    P1378 油滴扩展[深搜]
    P1514 引水入城[搜索,线段覆盖]
    TYVJ1391 走廊泼水节
    【BZOJ1196】公路修建问题
    【BZOJ3624】免费道路
    【BZOJ2429】聪明的猴子
  • 原文地址:https://www.cnblogs.com/derekchen/p/5590579.html
Copyright © 2011-2022 走看看