First-class Everything (Python缔造者Guido van Rossum关于bound/unbound method的来历叙述)

First-class
Everything


-- Guido van Rossum

First-class object: 第一类对象。意指可在执行期创建并作为参数传递给其他函数或存入一个变量的对象。

简而言之,第一类对象在使用时没有任何限制。第一类对象典型特征是可以动态创建、销毁,作为参数传递,可以作为返回值,具有一个变量的所具有的所有特性。

我关于Python的一个发展目标就是所有的对象都是第一类对象。鉴于此,我希望Python中的所有已命名的对象都具有相同的状态。也就是说,所有对象都可以赋值给变量,可以放进列表中,保存在字典里,作为参数传递等等。

Python的实现原理让这个目标变得简单。所有Python的对象都基于一个相同的C语言数据结构,这种结构充斥着Python解释器。变量、列表、函数等所有东西都使用这个数据结构的变体。这个数据结构与它要呈现的对象类型无关,无论是简单如整数,复杂如类都一样。

尽管实现第一类对象看起来简单,但我还是需要去面对类的一个微妙的地方——也就是,影响让method对象成为第一类对象的因素。

试看一个简单的Python类:

class A:
def __init__(self, x):
self.x = x
def spam(self, y):
print self.x, y

如果method对象成为第一类对象,那么它们就可以像其他Python对象一样被分配给变量。比如,某人可以写一条Python语句"s =
A.spam"。此时,变量"s"指向一个类的方法,这个方法其实是个函数。但是,方法和普通的函数不同。方法的第一个参数应该是该定义了该方法的那个类的实例。

为解决这个问题,我创造了一种可调用对象"unbound
method"。一个未绑定方法其实就是对实现该方法的函数的封装,它强制要求了它接收的第一个参数必须是定义了该方法的类的实例。因此,如果有人想像函数那样调用未绑定方法"s",他们只能将class
A的一个实例作为第一个参数传递给"s"。就像"a = A(); s(a)"[注1]。

但随之带来一个问题,如果有人写了一条语句引用某个对象实例上的一个方法。比如,某人创建了一个实例"a = A()",然后写了另一条语句"s =
a.spam"。此时,变量"s"再次指向一个类的方法,但是要引用这个方法需要通过instance对象"a"。为解决这个问题,另一个可调用对象"bound
method"就派上用场了。这个对象也是对函数对象进行了一层简单封装。但是,这个封装对象隐式地保存了用来获取method的instance对象。因此,在执行"s()"时会隐式地将使用实例"a"作为第一个参数去调用目标方法。

实际上,bound和unbound方法都是使用同一种内部类型来呈现。该类型的对象有一个属性包含了指向某个实例的索引。如果该索引为None,那么它表示的就是unbound
method,否则bound method。

尽管bound和unbound可能看起来不是很重要的小细节,但它们在Python类中却是很至关重要的一部分。每当在程序中执行"a.spam()"时,它的执行过程其实分为两部分。首先,查找"a.spam",这个过程结束后返回一个bound
method——一个可调用对象;然后,对该对象使用函数调用符"()",从而使用用户提供的参数对方法进行调用。

[注1]在Python 3000中,unbound
method的概念已去除,表达式"A.spam"返回一个函数对象。事实证明,对第一个参数必须是A的实例的限制对诊断问题几乎毫无帮助,对一些高级用法反而常常是个障碍。所谓高级用法可以理解为鸭子型态。

First-class Everything (Python缔造者Guido van Rossum关于bound/unbound
method的来历叙述)

时间: 2024-11-06 17:27:12

First-class Everything (Python缔造者Guido van Rossum关于bound/unbound method的来历叙述)的相关文章

[Python] 当猎头遇上 Guido van Rossum

Guido van Rossum 收到猎头的邀请函和他的回复. 猎头 你好,Guido! 我在 Google 搜索中无意间看见你的简历.看起来你精通 Python.我非常愉快能够得到你的回复并了解你的兴趣与是否有空. 我们的客户急需 Python 开发者,工作地点在 ***.以下为岗位详述.如果你有兴趣并且有空的话,请给我一份最新的简历,内附你的期望报酬和到岗时间. ... Guido 没空,没兴趣.

JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议

软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编程作为自己职业生涯的起点.如何学好编程?如何成为优秀的程序员?如何规划好程序员这个职业?是许多年轻人关注的问题.在Infoworld最近做的一次调查中,邀请到了JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Spring Framework创建者Rod

Python创始人Guido宣布退出PEP管理层,但,会真的退休吗?

Thu Jul 12 10:57:35 EDT 2018,Guido在邮件中表示,退出PEP的管理层,给自己来个大长假,毕竟年纪也不小了. 但他会作为一个普通的Python核心开发者,留在社区,但是所有的决定就看大家的了. 而且,他不准备指定继任者. 他对社区的下一步发展提出了几个问题: 民主制? 无政府? 独裁? 联邦? 这个当然也留给大家决定了,曾经被称为独裁者的领导人,这次并没有独裁. 随后,有很多人回复邮件,大多表达了对Guido的感谢,也开始就下一步的发展表达自己的想法,有赞成投票的,

python:基础复习

大纲 一.python简介 Guido van Rossum 仁慈的独裁者 ABC Modula-3 Unix shell C 1989年圣诞期间 诞生 2000年10月16日 2.0 2008年12月3日 3.0 放弃对python2的兼容,现在存在python2.0和python3.0并行,百分之四十的库还没有迁移到3.0 解释型通用语言 通用语言是相对于DSL(领域专用语言)来说的,例如:写puppet的.pp文件的语言 编译型语言|本地语言 虚拟机|解释器 上运行 优雅.明确.简单 有且

走进Python世界(一)入门介绍

什么是Python Python是一种解释性,面向对象的,带有动态语义的高级程序设计语言.它能够使你在编程时能够保持一种简洁易懂的风格,不用过多考虑功能实现的. Python的几个重要阶段 CNRI 时期: CNRI 是资助Python发展的重要单位,Python1.5之前的版本都是这段时间内完成的 BeOpen时期:Python作者 Guido van Rossum与BeOpen公司合作,此期间 推出了2个分支,Python1.6 和Python2.0 DC时期:Python作者将Python

python基础(1)——简介与安装

1.python简介 PYTHON创始人:Guido van Rossum,在Python界被誉为仁慈的独裁者. 借鉴了unix shell ,c的特点 1989圣诞期间发布,python已经有20年的历史了,比java早很多,java第一个版本才是1994年发布的. 2000年10.16 python2.0发布,此时python才真正成为一个功能完善,非常好用的语言 2008年12月3日,python3发布,相比与python2而言,改变比较大,不兼容python2.目前是两个版本共存的 2.

python之最强王者(1)——python入门简介

1.Python简介 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年. 像Perl语言一样, Python 源代码同样遵循 GPL(GNU General Public License)协议. Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其

<转>Python OOP(1):从基础开始

转自  http://www.cnblogs.com/BeginMan/p/3510786.html 本文旨在Python复习和总结: 1.如何创建类和实例? # 创建类 class ClassName(object): """docstring for ClassName""" def __init__(self, arg): super(ClassName, self).__init__() self.arg = arg # 创建实例 ins

一行python代码实现树结构

树结构是一种抽象数据类型,在计算机科学领域有着非常广泛的应用.一颗树可以简单的表示为根, 左子树, 右子树. 而左子树和右子树又可以有自己的子树.这似乎是一种比较复杂的数据结构,那么真的能像我们在标题中所说的那样,用一行Python代码就可以实现吗? 一行代码实现? 由于树形结构的外层和内层有着相似的结构,所以多可以用递归的方式定义树.再利用Python中提供的defaultdict,我们就可以很轻松地定义树了,而且只有一行代码. from collections import defaultd