First-class object


1. 定义

一等对象(first-class object)在计算机科学中指和其他 variable 一样享有这样一些特权的对象:

  • 可以被赋值给一个变量
  • 可以嵌入到数据结构中
  • 可以作为参数传递给函数
  • 可以作为值被函数返回

源起
这一名称最早由 Christopher Strachey 在 1960 年代发明,原称“一等公民”(First-class citizen),意指函数可作为电脑语言中的一等公民。英文中也称“First-class entity”或“First-class value”。

2. 实例

  • 绝大多数语言中,数值与基础型别都是第一类对象。
  • 然而不同语言中对函数的区别很大,例如 C 语言与 C++ 中的函数不是第一类对象,因为在这些语言中函数不能在执行期创造,而必须在设计时全部写好。相比之下,Scheme 中的函数是第一类对象,因为可以用lambda表达式来创造匿名函数并作为第一类对象来操作;JavaScript 和 Python 中的函数也是

以 Python 为例:

  1. 函数名字是对函数的引用。python中所有都是对象,函数名字是函数对象的引用。
>>> def foo():
... print "in foo"
...
>>> foo
<function foo at 0x1018f7668>
  1. 函数最为一等对象可以赋值给其它变量。

将 foo 赋值给 f,那么 f 和 foo 是对同一个函数的引用。从 id(f), id(foo) 相同,就可以看出。

Python id()
id() function returns the identity of the object. This is an integer that is unique for the given object and remains constant during its lifetime.

>>> f = foo
>>> foo()
in foo
>>> f()
in foo
>>> id(f), id(foo)
(4321146472, 4321146472)
>>> f
<function foo at 0x1018f7668>
  1. 函数作为一等对象,可以作为参数传递。如下例中的 f
def f(*args, **kwargs):
    if args:
        for item in args:
            print(item)
    if kwargs:
        for key in kwargs:
            print(key, kwargs[key])


def foo(func, *args, **kwargs):
    func(*args, **kwargs)


if __name__ == '__main__':
    t1 = (2, 3)
    d1 = {'1':'python', '2':'php'}
    foo(f, *t1, **d1)

# 2
# 3
# ('1', 'python')
# ('2', 'php')
  1. 函数作为第一类对象,可以作为函数的返回值。
def foo(x):
    '''演示代码 由黄哥所写'''
    def inner(y):
        return x + y
    return inner


if __name__ == '__main__':
    p = foo(3)
    print(p(5))

文章作者: Shane Tsui
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Shane Tsui !

  目录