• 【Python】Python 新式类介绍


    本文转载自:kaka_ace's blog

    我们使用 Python 开发时, 会遇到 class A 和 class A(object) 的写法,
    这在 Python2 里是有概念上和功能上的区别, 即经典类(旧式类)与新式类的区别,
    英文上分别描述为 old-style(classic-style) 与 new-style.

    通过搜索, 先查阅了三个资料链接:
    官方文档
    stackoverflow 解答
    Python Types and Objects

    根据 stackoverflow 答案引出的语言发明者 Guido 写的一篇文章:
    The Inside Story on New-Style Classes
    其总结可以作为官方解释:


    • low-level constructors named __new__() – 低级别的构造函数.
      Note: Python 的 class __init__ 并不是其他语言意义上的构造函数,
      在 new 创建实例后对实例属性初始化的函数.

    • descriptors, a generalized way to customize attribute access – 描述符.
      或者说描述符协议支持.descriptor protocol __get__, __set__ ,__delete__ 等,
      可以阅读 descriptor 文档

    • static methods and class methods - 静态方法和类方法

    • properties (computed attributes) – 属性访问 setter getter.

    • decorators (introduced in Python 2.4) – 装饰器.
      现在装饰器语法糖遍布各Python框架.

    • slots – 用户设置后可以限定实例的属性.
      在 Python2 中替代 __dict__, 可以节省近 2/3 内存, Python3 中可以
      不因为优化内存使用率而使用 slots, 因为 __dict__ 结构内存做了优化,
      Note: __dict__ 并不是 Python 意义上的内置的 dict, 其实是一个 proxy 类.

    • a new Method Resolution Order (MRO) – MRO 方法解析次序改变
      (由左递归改为C3算法)

    另一个答案增加了一点:

    • super added – super 方法支持

    关于C3MRO介绍, 可以点击链接

    以下是翻译官方文档的资料 (Python2的内容)


    Classes and instances come in two flavors: old-style (or classic) and new-style.
    类和实例有两种方式: 旧式(或者经典) 和 新式类.

    Up to Python 2.1 the concept of class was unrelated to the concept of type,
    and old-style classes were the only flavor available. For an old-style class,
    the statement x.__class__ provides the class of x, but type(x) is always
    <type ‘instance’>. This reflects the fact that all old-style instances, independent
    of their class, are implemented with a single built-in type, called instance.

    一直到 Python 2.1 class 的概念不与 type 不一样, 旧式类是唯一的风格. 对于一个
    旧式类里, 陈述句 x.__class__ 提供 x 的 class, 但是 type(x) 一直是 <type ‘instance’>.
    它反应了所有旧式类实例, 独立于它们的 class, 它们通过一个简单的内建 type 实现,
    被称作 实例 instance.

    New-style classes were introduced in Python 2.2 to unify the concepts of class
    and type. A new-style class is simply a user-defined type, no more, no less.
    If x is an instance of a new-style class, then type(x) is typically the same as
    x.__class__ (although this is not guaranteed – a new-style class instance is
    permitted to override the value returned for x.__class__).

    新式类在Python 2.2 引入, 用于统一 class 和 type 的概念. 一个新式类简化了用户
    自定义的 type, 不多不少. 如果 x 是一个新式类的实例 instance , type(x) 典型地
    与 x.__class__ (尽管这并不能保证 – 一个新式类被允许重写 x.__class__ 的值)一致.

    eg:
    >>> class A(object): pass
    >>> a = A()
    >>> a.__class__
    >>> <class ‘__main__.A’>
    >>>
    >>> type(a)
    >>> <class ‘__main__.A’>

    而 class A 的 type 和 __class__ 是 <type ‘type’>

    >>> A.__class__
    >>> <type ‘type’>

    The major motivation for introducing new-style classes is to provide a unified
    object model with a full meta-model. It also has a number of practical benefits,
    like the ability to subclass most built-in types, or the introduction of
    “descriptors”, which enable computed properties.

    引入新式类主要的改进是提供统一的带有完整 meta-model 的 object model.
    它可以拥有大量的使用价值, 类似于 内建 type的 subclass的能力 或者 描述符
    descriptors 介绍(允许使用的计算属性)

    For compatibility reasons, classes are still old-style by default. New-style
    classes are created by specifying another new-style class (i.e. a type) as a
    parent class, or the “top-level type” object if no other parent is needed. The behaviour of new-style classes differs from that of old-style classes in
    a number of important details in addition to what type() returns. Some of these
    changes are fundamental to the new object model, like the way special methods
    are invoked. Others are “fixes” that could not be implemented before for
    compatibility concerns, like the method resolution order in case of multiple
    inheritance.

    考虑到兼容的因素, class 使用默认是旧式类. 新式类通过指定的另一个新式类
    (如 一个 type)作为父类, 或者是顶级类 object(如果没有其他父类需要)创建.
    除了 type() 的返回方式,新式类与旧式类的行为从大量重要细节区分. 这些变化
    对于新式类 oject model 是基础性的, 类似如 特别的方法被调用时的方式. 其他
    特性属于修复以前不能实现的兼容性问题, 例如多重继承下的 MRO 方法解析次序.

    Tips:
    1. 旧式类多重继承使用的是左递归遍历方式
    2. 新式类多重继承算法使用 C3 算法.

    While this manual aims to provide comprehensive coverage of Python’s class
    mechanics, it may still be lacking in some areas when it comes to its coverage
    of new-style classes. Please see https://www.python.org/doc/newstyle/ for
    sources of additional information.

    该手册目标是提供综合性地覆盖介绍 Python 的 class 机制, 在新式类的覆盖
    范围内, 它可能依然会在某些方面缺少信息. 请阅读 https://www.python.org/doc/newstyle/
    来获额外的信息源.

    Old-style classes are removed in Python 3, leaving only new-style classes.
    旧式类在 Python3 中去除, 只保留新式类.

    原创文章,转载请注明: 转载自kaka_ace's blog

    参考资料:

      1.http://www.zhihu.com/question/19754936

  • 相关阅读:
    ThinkPHP 3 的输出
    zookeeper 伪集群模式
    zookeeper
    MVC模式和URL访问
    全民上云时代,如何降低成本?
    华为云教你7天玩转电商应用性能调优,课程免费速来报名!
    一统江湖的大前端(6)commander.js + inquirer.js——懒,才是第一生产力
    一统江湖的大前端(5)editorconfig + eslint——你的代码里藏着你的优雅
    一统江湖的大前端(4)shell.js——穿上马甲我照样认识你
    【Python3网络爬虫开发实战】1.3.1-lxml的安装
  • 原文地址:https://www.cnblogs.com/vincently/p/4601456.html
Copyright © 2020-2023  润新知