我正在学习python教程。它解释了函数是如何在Python中的第一类对象。
def foo():
pass
print(foo.__class__)
print(issubclass(foo.__class__,object))
我获得上述代码的输出是
<type 'function'>
True
这个程序应该证明函数是python中的第一类对象?我的问题如下。
function.__class__
表示什么?它返回一个元组<type,function>
并不意味着什么?答案 0 :(得分:11)
以下是Guido在博客中关于头等对象的说法:
我的Python目标之一就是让所有对象都是“头等舱”。通过这个,我的意思是我希望所有可以在语言中命名的对象(例如,整数,字符串,函数,类,模块,方法等)具有相同的状态。也就是说,它们可以分配给变量,放在列表中,存储在字典中,作为参数传递,等等。
whole blog post值得一读。
在您发布的示例中,教程可能会指出第一类对象通常是“对象”类的后代。
答案 1 :(得分:6)
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__
将为<type 'list'>
。如果你有一个日期时间(from datetime import datetime
然后是d = datetime.now()
,那么d
实例的类型将是<type 'datetime.datetime'>
。他们只是在python中显示一个函数不是一个品牌新概念。它只是<type 'function'>
的普通对象。
答案 2 :(得分:2)
您证明函数是第一类对象,因为您被允许将foo
作为参数传递给方法。
这篇文章很好地总结了第一类对象的属性:https://stackoverflow.com/a/245208/3248346
根据语言,这可以 意味着:
- 可表达为匿名字面值
- 可存储变量
- 可存储在数据结构中
- 具有内在身份(独立于任何给定名称)
- 与其他实体的平等可比性
- 可作为参数传递给过程/函数
- 作为程序/功能的结果可以返回
- 在运行时可构建
- 可打印
- 可读
- 可在分布式流程中传播
- 可以在运行过程之外存储
答案 3 :(得分:2)
关于第三个问题,<type 'function'>
不是元组。 Python的元组符号是(a,b)
,而不是尖括号。
foo.__class__
返回类对象,即表示foo
所属的类的对象;类对象碰巧在解释器中生成描述性字符串,在这种情况下,告诉您foo
的类是名为type
的{{1}}。 (现代Python中的类和类型基本相同。)
除此之外,它并不意味着很多,就像任何其他对象一样,函数具有类型:
'function'
答案 4 :(得分:1)
关于您对@ 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
>>>
方法是类中/的函数,但该概念也适用于函数(类外)。函数(作为对象)包含在数据结构中并传递给另一个对象。