【问题标题】:Are functions first class objects in python?函数是python中的第一类对象吗?
【发布时间】:2014-05-27 01:55:55
【问题描述】:

我正在学习一个关于 python 的教程。它解释了函数如何成为 Python 中的第一类对象。

def foo():
        pass
print(foo.__class__)

print(issubclass(foo.__class__,object))

我从上面的代码得到的输出是

<type 'function'>
True

这个程序应该证明函数是python中的第一类对象?我的问题如下。

  1. 以上代码如何证明函数是第一类对象?
  2. 第一类对象的属性是什么?
  3. function.__class__ 表示什么?它返回一个元组&lt;type,function&gt;,这并不意味着什么?

【问题讨论】:

  • 一个类的事实使它成为一个拳头[SIC]类对象
  • 那么python中的所有东西都有class成员吗?并且输出 表示它是函数类型的对象?

标签: python python-2.7 object


【解决方案1】:

Guido 在他的博客中对头等对象的评价如下:

我对 Python 的一个目标是让所有对象都是“一流的”。我的意思是,我希望所有可以用该语言命名的对象(例如,整数、字符串、函数、类、模块、方法等)都具有同等的地位。也就是说,它们可以分配给变量、放置在列表中、存储在字典中、作为参数传递等等。

whole blog post 值得一读。

在您发布的示例中,教程可能会指出第一类对象通常是“对象”类的后代。

【讨论】:

    【解决方案2】:

    First-class 仅仅意味着函数可以被视为一个值——也就是说,您可以将它们分配给变量,从函数返回它们,以及将它们作为参数传递。那就是你可以做这样的代码:

    >>> def say_hi():
            print "hi"
    >>> def say_bye():
            print "bye"
    >>> f = say_hi
    >>> f()
    hi
    >>> f = say_bye
    >>> f()
    bye
    

    这很有用,因为您现在可以像任何普通变量一样将函数分配给变量:

    >>> for f in (say_hi, say_bye):
            f()
    hi
    bye
    

    或者编写高阶函数(将函数作为参数):

    >>> def call_func_n_times(f, n):
            for i in range(n):
                f()
    >>> call_func_n_times(say_hi, 3)
    hi
    hi
    hi
    >>> call_func_n_times(say_bye, 2)
    bye
    bye
    

    关于 python 中的__class__ 告诉您拥有对象的type。例如,如果你在 python 中定义一个列表对象:a = [1,2,3],那么a.__class__ 将是&lt;type 'list'&gt;。如果你有一个日期时间(from datetime import datetime 然后d = datetime.now(),那么d 实例的类型将是&lt;type 'datetime.datetime'&gt;。他们只是表明在python中函数不是一个全新的概念。它只是一个普通的对象&lt;type 'function'&gt;.

    【讨论】:

      【解决方案3】:

      您证明了函数是第一类对象,因为您可以将 foo 作为参数传递给方法。

      这篇文章很好地总结了第一类对象的属性:https://stackoverflow.com/a/245208/3248346

      根据语言,这可以 暗示:

      • 可表示为匿名文字值
      • 可存储在变量中
      • 可存储在数据结构中
      • 具有内在身份(独立于任何给定名称)
      • 在平等方面与其他实体具有可比性
      • 可作为参数传递给过程/函数
      • 作为过程/函数的结果可返回
      • 在运行时可构造
      • 可打印
      • 可读性
      • 可在分布式进程之间传输
      • 可存储在正在运行的进程之外

      【讨论】:

      • 我们在谈论哪种方法?打印 ?我们将 foo.__class__ 传递给 print,而不是 foo 本身。据我了解 foo.__class__ 是 foo 的属性(或成员变量)?
      【解决方案4】:

      关于您的第三个问题,&lt;type 'function'&gt; 不是元组。 Python 的元组表示法是(a,b),而不是尖括号。

      foo.__class__返回一个类对象,即代表foo所属类的对象;类对象恰好在解释器中产生描述性字符串,在这种情况下告诉您foo 的类是type,称为'function'。 (类和类型在现代 Python 中基本相同。)

      除此之外,它并不意味着很多,就像任何其他对象一样,函数也有一个类型:

      >>> x = 1
      >>> x.__class__
      <type 'int'>
      
      >>> y = "bar"
      >>> y.__class__
      <type 'str'>
      
      >>> def foo(): pass
      ... 
      >>> foo.__class__
      <type 'function'>
      

      【讨论】:

        【解决方案5】:

        关于您对@I.K.s 回答的评论,下面的f_at_2() 将是方法

        def f_at_2(f):
            return f(2)
        
        def foo(n):
            return n ** n
        
        def bar(n):
            return n * n
        
        def baz(n):
            return n / 2
        
        funcs = [foo, bar, baz]
        
        for f in funcs:
            print f.func_name, f_at_2(f)
        

        ...

        >>> 
        foo 4
        bar 4
        baz 1
        >>> 
        

        方法是类中的函数,但这个概念也适用于函数(类之外)。函数(作为对象)包含在数据结构中并传递给另一个对象。

        【讨论】:

          猜你喜欢
          • 2014-02-01
          • 2014-10-07
          • 2017-06-09
          • 2014-09-02
          • 2015-02-08
          • 2011-10-13
          • 2011-04-25
          • 1970-01-01
          • 2016-10-19
          相关资源
          最近更新 更多