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

求机器人可用跳跃方式 (Python 代码实现)

今天在 segmentfault 看到有趣的 编程题
描述如下:
” 一救援机器人有三种跳跃模式,可分别跳跃1m,2m,3m的距离,
请用程序实现该机器人行进n米路程时可用的跳跃方式。

程序语言不限,当距离n值足够大时,程序执行时间尽量小。

例:当距离为4米时,输出结果有7种:

1m,1m,1m,1m
1m,1m,2m
1m,2m,1m
1m,3m
2m,1m,1m
2m,2m
3m,1m

根据另一个用户 AUV_503516 提供的思路,
转会为数学的思考方式:
由条件定义 f(n) 为 n米的可用步骤序列.
f(1) = ( (1), )
f(2) = ( (1, 1), (2,) )
f(3) = ( (1, 1, 1), (1, 2), (2, 1), (3,) )

求 f(n), 每一跳跃可以使用的距离是 1, 2, 3
f(n) = f(1) + f(n-1) = f(2) + f(n-2) = f(3) + f(n-3)
= f(n-1) + f(1) = f(n-2) + f(2) = f(n-3) + f(3)

另外 f(delta) + f(n – delta) 有可能与 f(n – delta) + f(delta) 是用一个序列,
求 f(n) 需要去重.

由公式定义, 使用 Python代码实现如下:

Continue reading

Python3 使用 nonlocal keyword 实现保存状态的嵌套函数

前言:
最近阅读一本书《代码之髓》, 其中篇章:《7.3 静态作用域是完美的吗》
介绍了 Python3 的 nonlocal 关键字, 从12月将工作语言升级到Python3后,
才从一本讲述编程语言概念的书籍里知晓这个 nonlocal -_-b

首先写个小Demo:

Continue reading