Python type() function returns a callable
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') |
如何理解这是什么做的吗? </P >
函数的作用是:返回一个对象的类。在
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'> |
因此,由于
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 |
所以,把事情放在一起:
int 是type 类型的对象。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(12) 只是一种写int 的丑陋方式。type(12)(12) 只是一种写int(12) 的丑陋方式。
所以,"是的!",
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__.