浅谈python之新式类

  


  

  

本文中代码运行python版的本一律采取2.7.13
  

  

科普:
  

  

经典类:经典类
  

  

新式类:新型类
  

  
      <李> python2.2之前并没有新式类李   <李> python2.2 - 2.7新式类与经典类并存,默认使用经典类,除非显式继承对象李   <李> python3。X中去除了经典类,用户定义的所有类都隐式继承自对象李   
  


  

        类新(对象):#显式继承对象类   通过      类旧:   通过      类Old2 ():   通过   之前      

上述代码中的3种定义类的方法,只有第一种方法定义的是新式类。
  

  

  

新式类与经典类最主要的区别在于继承顺序,事实上,对于用户定义的每一个类,python都会计算出一个方法解析顺序(方法解析顺序,MRO)列的表,它代表了类继承的顺序,而由于经典类与新式类采用的算法不一致,相同的继承关系可能会出现不一样的MRO列表。
  

        进口检查   类D:   通过      C类(D):   通过      B类(D):   通过      A (B, C):   通过      打印inspect.getmro (A)   # (& lt;类的__main__。在0 x000000000322bb88>,   # & lt;类__main__。B在0 x000000000322b9a8>   # & lt;类__main__。D在0 x000000000322bc48>   # & lt;类__main__。在0 x000000000322b948> C)      D类(对象):   通过      C类(D):   通过      B类(D):   通过      A (B, C):   通过      打印inspect.getmro (A)      # (& lt;类__main__.A的祝辞,   & lt;类__main__.B的祝辞,   & lt;类__main__.C的祝辞,   & lt;类__main__.D的祝辞,   & lt;类型对象的祝辞)      

可以看的到,经典类的MRO顺序A-B-D-C与新式类的MRO顺序A-B-C-D-object是存在差异的,这可能会是我们日常会遇到的坑。
  

  

而除了继承顺序的差异,新式类还添加了内置属性__slots__
  

  

一般来说,每个实例都有一个字典来管理实例的属性,我们可以用__dict__来查看(__dict__并不保存类属性),它允许我们动态地修改实例的属性,但是这也意味着每个实例都会有1个独立的字典需要我们去维护,当我们需要创建大量的实例时,这个操作是十分消耗内存的。
  

  

当我们在定义类时添加了__slots__属性后,对象在实例化时就不会创建字典来管理实例属性,而实例只能定义在__slots__里边已经设定好的属性名,不允许动态添加其他未在__slots__里定义的属性
  

        类学生(对象):   __slots__=(“id”,“姓名”,“性别”)   def考试(自我):   通过      s1=学生()   “__dict__”dir (s1) #假   s1。id=10001   s1。类=1   # AttributeError:‘学生’对象没有属性的类的      def func ():   通过      s1。考试=函数   # AttributeError:‘学生’对象属性“f”是只读的      

使用__slots__后我们不再能够动态地修改实例的属性,那么使用__slots__究竟有什么好处呢& # 63;
  

  

优点:
  1。节省内存
  2。提高属性访问速度
  

  

缺点:
  1。不能动态修改实例属性
  

  

当然,除了继承顺序和__slots__,新式类添加了__getattribute__方法,还修改了实例的类型
  

        类新(对象):   通过      类旧:   通过      新的=new ()   旧=()   打印(新)   # & lt; __main__。在0 x0000000003262208>新对象;   打印(旧)   # & lt; __main__。旧实例0 x000000000321c6c8>      

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

浅谈python之新式类