浅谈python之新式类

 更新时间:2018年08月12日 16:34:02   作者:Dear、  
这篇文章主要介绍了浅谈python之新式类,详细的介绍了如何使用新式类和经典类的区别。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

前言

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

科普:

经典类:classic class

新式类:new-style class

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

 如何使用新式类

 class New(object): # 显式继承object类
 pass

class Old: 
 pass
  
class Old2():
 pass 

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

新式类VS经典类 

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

import inspect
class D:
  pass
 
class C(D):
  pass 
 
class B(D):
  pass
 
class A(B, C):
  pass  

print inspect.getmro(A)
# (<class __main__.A at 0x000000000322BB88>, 
# <class __main__.B at 0x000000000322B9A8>, 
# <class __main__.D at 0x000000000322BC48>, 
# <class __main__.C at 0x000000000322B948>)

class D(object):
  pass
 
class C(D):
  pass
 
class B(D):
  pass
 
class A(B, C):
  pass

print inspect.getmro(A)

# (<class '__main__.A'>, 
<class '__main__.B'>, 
<class '__main__.C'>, 
<class '__main__.D'>, 
<type 'object'>) 

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

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

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

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

 class Student(object):
 __slots__ = ('id', 'name', 'gender')
 def exam(self):
  pass

s1 = Student()
'__dict__' in dir(s1) # False
s1.id = 10001
s1.class = 1 
# AttributeError: 'Student' object has no attribute 'class'

def func():
 pass

s1.exam = func 
# AttributeError: 'Student' object attribute 'f' is read-only

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

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

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

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

 class New(object):
 pass
 
class Old:
 pass
 
new = New()
old = Old()
print(new)
# <__main__.New object at 0x0000000003262208>
print(old)
# <__main__.Old instance at 0x000000000321C6C8>

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

相关文章

  • Python 实现键盘鼠标按键模拟

    Python 实现键盘鼠标按键模拟

    这篇文章主要介绍了Python 实现键盘按键模拟的方法,帮助大家提高办公效率,感兴趣的朋友可以了解下
    2020-11-11
  • 如何使用Flask-Migrate拓展数据库表结构

    如何使用Flask-Migrate拓展数据库表结构

    这篇文章主要介绍了如何使用Flask-Migrate拓展数据库表结构,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • python编程开发时间序列calendar模块示例详解

    python编程开发时间序列calendar模块示例详解

    这篇文章主要为大家介绍了python编程开发时间序列calendar模块示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步早日升职加薪
    2021-11-11
  • python与json数据的交互详情

    python与json数据的交互详情

    这篇文章主要介绍了python与json数据的交互详情,json是一种独立于编程语言和平台的轻量级数据交换方式,更多相关内容介绍,需要的朋友可以参考一下
    2022-07-07
  • 浅谈python 中的 type(), dtype(), astype()的区别

    浅谈python 中的 type(), dtype(), astype()的区别

    这篇文章主要介绍了浅谈python 中的 type(), dtype(), astype()的区别,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Python中aiohttp的简单使用

    Python中aiohttp的简单使用

    aiohttp是Python中一个强大的异步HTTP客户端和服务器框架,它可以帮助开发者快速构建高性能的Web应用程序。本文将介绍aiohttp的基本概念、使用方法和常见应用场景,帮助读者更好地了解和使用这个优秀的框架
    2023-03-03
  • python2.7 mayavi 安装图文教程(推荐)

    python2.7 mayavi 安装图文教程(推荐)

    下面小编就为大家带来一篇python2.7 mayavi 安装图文教程(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Python爬虫实现爬取百度百科词条功能实例

    Python爬虫实现爬取百度百科词条功能实例

    这篇文章主要介绍了Python爬虫实现爬取百度百科词条功能,结合完整实例形式分析了Python爬虫的基本原理及爬取百度百科词条的步骤、网页下载、解析、数据输出等相关操作技巧,需要的朋友可以参考下
    2019-04-04
  • python中的exec()、eval()及complie()示例详解

    python中的exec()、eval()及complie()示例详解

    这篇文章主要介绍了python中的exec()、eval()及complie(),本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Python实现文本相似度分析

    Python实现文本相似度分析

    这篇文章主要旨在通过设计和实现有关文本相似度比较的类Vector和Sketch,帮助大家进一步掌握设计Python类来解决实际问题的能力,有需要的小伙伴可以学习一下
    2023-07-07

最新评论