Python 新式类介绍 (包含 new-style-and-classic-classes 文档翻译)

我们使用 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__ 的值)一致.

Continue reading

value_category (cppreference.com 文档翻译) (校正 by 囧多)

原文链接: http://en.cppreference.com/w/cpp/language/value_category

Value categories:

Each C++ expression (an operator with its arguments, a literal, a variable name, etc) is characterized by two
independent properties: a type and a value category. Each expression has some non-reference type, and each
expression belongs to exactly one of the three primary value categories.

每个C++表达式(带有参数的运算符, 一个字面值, 一个变量名, 等等) 由两个属性来定性:
一个 type 表达式类型 和 一个 value category 值分类. 每个表达式都有一个或者
多个非引用类型, 每一个表达式都仅属于3大值分类中的一类.

Continue reading