类的编码基础

一。类对象: 

     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__

         

         

十二。类和字典的关系:

        

             

              

           

     

    

      

        

原文地址:https://www.cnblogs.com/derekchen/p/5590579.html