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

Python type() function returns a callable

type(object)时返回的类型的对象。 </P >

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> 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)>
>>>

在这个语法, </P >

1
my_module = type(__builtins__)('my_module')

type(__builtins__)应该回报callable面向那把('my_module')argument AS。type(object)callable时返回的对象吗? </P >

如何理解这是什么做的吗? </P >


函数的作用是:返回一个对象的类。在type(__builtins__)的情况下,它返回模块类型。模块的语义在:https://docs.python.org/3/library/stdtypes.html modules中详细介绍。

cpython的源代码在objects/moduleObject.c::module_init()中有此项:

1
2
3
4
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))

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


让我们来看一些例子:

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

因此,由于type(int)返回type,因此认为

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

自从

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

更重要的是:

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

现在,如果你改为这样做:

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

这也是预期的

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

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

所以,把事情放在一起:

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

另一个例子:

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

也就是说

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

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

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

我有一种感觉,我可能使这看起来比实际情况复杂得多…不是!

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

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

所以,"是的!",type()返回可调用的。但最好把它当作(官方文件)来考虑。

class type(object)

With one argument, return the type of an object. The return value is a type object and generally the same object as returned by object.__class__.