Python “函数”和“模块”的类型是什么`
既然Python “函数”和“模块”的类型是什么`,python,python-3.x,Python,Python 3.x,既然函数是一个类,而类是一个对象,那么函数的类型是什么,即它是什么的实例 正如评论所建议的那样 >>> type(function) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'function' is not defined 函数是Python中最简单的可调用对象。 内置模块存储整个语言中使用的各种不同类型。它还包含
函数
是一个类,而类是一个对象,那么函数
的类型是什么,即它是什么的实例
正如评论所建议的那样
>>> type(function)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'function' is not defined
函数是Python中最简单的可调用对象。 内置模块存储整个语言中使用的各种不同类型。它还包含与实例方法相对应的:
>>> type(builtins)
<class 'module'>
>>> type(module)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'module' is not defined
在解释器中调用类型(Foo.bar)
时,输出是
,但这并不一定意味着类的名称是'function'
,而只是类的表示形式(\urepr\uuu
):
这意味着该类型是它自己的类(即
type.\uuuuu class\uuuuu
指向自身)。这是在实现级别实现的。您是否尝试了类型(type(OptimizedRectangle.get_area))
?这应该是显而易见的<代码>类型(…)返回一个类型。因此type(type(…)
将是type
。FunctionType:function
和module
是type
的实例。您会得到namererror
s,因为function
和module
没有在任何地方定义。将类命名为function
或module
并不意味着它实际上可以通过名称查找函数或模块
。这是两种不同的名称,仅通过约定和类
语句的默认行为链接。请注意类型
模块并不特殊。它不是任何类型的位置。无论实现了什么类型,在那里定义的名称都不是“真实”名称或任何东西。例如,要定义types.FunctionType
,types.py
只需定义一个函数\u f
并设置FunctionType=type(\u f)
。谢谢。“内置模块类型存储在整个语言中使用的所有不同类型。”既然模块类型中定义的类型在整个语言中使用,为什么它们不在语言中定义为内置类型(如列表,int
),但是在标准库中的模块类型中?@Tim所有可以在Python中使用而无需额外导入的对象都存储在模块\uuuuuuuuuu内置项中。这些对象构成了语言的“基础”,并且可能经常使用(例如转换为int
或list
)。但是,对于函数的定义,有def
语句,即无需参考特定类型。同样,对于duck类型,用户可能会测试callable(…)
而不是与FunctionType
进行比较。存储在types
中的对象提供了一个标准,用于比较特定对象的特定类型(无论何时需要)。谢谢@客人。“所有可以在Python中使用而无需额外导入的对象都存储在模块\uuuuuu内置\uuuu
”中。您的意思是说在Python3中,所有内置类型,如int
和dict
都是从模块内置导入的吗?它们不是语言的内置部分,而不是模块吗?@Tim准确地说,模块的名称是,但通过将其绑定到名称\uuuuuuu内置项\uuuuuuuuu
(至少对于CPython而言)可以使用它。内置类型是用解释器的语言实现的(例如,C代表CPython),并通过这个内置模块提供。这使得语言更加独立,因为这些内置对象可以被视为常规Python对象(与用户定义对象的方式相同)。否则,有关内置的信息必须存储在编译器的某个地方。
>>> type(type(OptimizedRectangle.get_area))
<class 'type'>
>>> type(builtins)
<class 'module'>
>>> type(module)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'module' is not defined
>>> class Foo:
... def bar(self):
... pass
>>> type(Foo.bar) is types.FunctionType
True
>>> type(types.FunctionType).__repr__(type(Foo.bar))
"<class 'function'>"
>>> type(type) is type
True