Python type()函数返回一个可调用的

时间:2017-05-03 23:10:06

标签: python types module callable

type(object)返回对象的类型。

>>> type(__builtins__)
<type 'module'>
>>> name = type(__builtins__)
>>> type(name)
<type 'type'>
>>> name
<type 'module'>

>>> name('my_module')
<module 'my_module' (built-in)>
>>> name('xyz')
<module 'xyz' (built-in)>
>>> 

在此语法中,

my_module = type(__builtins__)('my_module')

type(__builtins__)应返回以('my_module')为参数的可调用对象。 type(object)返回可调用对象?

如何理解这是做什么的?

2 个答案:

答案 0 :(得分:3)

type()函数返回对象的类。在type(__builtins__)的情况下,它返回模块类型。模块的语义详见:https://docs.python.org/3/library/stdtypes.html#modules

CPython的源代码在Objects / moduleobject.c :: module_init()中有这个:

static char *kwlist[] = {"name", "doc", NULL};
PyObject *dict, *name = Py_None, *doc = Py_None;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "U|O:module.__init__",
                                 kwlist, &name, &doc))

这意味着您可以使用模块的 name 作为必需参数调用(实例化)模块对象,并将docstring作为可选参数。

答案 1 :(得分:1)

让我们来看看一些例子:

>>> type(int)
<class 'type'>

因此,由于type(int)会返回type,因此会显示

>>> type(int)(12)
<class 'int'>

>>> type(12)
<class 'int'>

更重要的是:

>>> (type(int)(12) == type(12)) and (type(int)(12) is type(12))
True

现在,如果您改为:

>>> type(int())
<class 'int'>

这也是预期的。

>>> (int() == 0) and (int() is 0)
True

>>> (type(int()) = type(0)) and (type(int()) is type(0))
True

所以,把事情放在一起:

  • inttype
  • 类型的对象
  • int()int
  • 类型的(整数)对象

另一个例子:

>>> type(str())
<class 'str'>

这意味着

>>> (type(str())() == '') and (type(str())() is '')
True

因此,它的行为就像一个字符串对象:

>>> type(str())().join(['Hello', ', World!'])
'Hello, World!'

我觉得我可能会让它看起来比实际上复杂得多......它不是!

type()返回一个对象的类。所以:

  • type(12)只是一种写作int
  • 的丑陋方式
  • type(12)(12)只是一种写作int(12)
  • 的丑陋方式

所以,&#34;是的!&#34;,type()返回一个可调用的。但考虑到这一点(来自official docs

会好得多
  

类型(对象)

     

使用一个参数,返回对象的类型。返回值是一个类型对象,通常与object .__ class __。

返回的对象相同