我如何理解输出`<class'yyy'=“”>`到Python解释器中的类型名称`xxx`?

时间:2017-10-01 03:42:44

标签: python python-3.x

在Python解释器中,当我输入类型名称xxx时,我会得到类似<class 'yyy'>的输出,其中yyyxxx不相同。请参阅以下示例。

我想知道为什么yyyxxx不同,它们分别是什么意思?感谢。

>>> builtins.staticmethod
<class 'staticmethod'>

>>> types.MethodType
<class 'method'>
>>> types.FunctionType
<class 'function'>
>>> types.BuiltinFunctionType
<class 'builtin_function_or_method'>
>>> types.BuiltinMethodType
<class 'builtin_function_or_method'>


>>> class C:
...     pass
... 
>>> C
<class '__main__.C'>

1 个答案:

答案 0 :(得分:1)

在Python中,所有类型都是对象。

您可以向他们申请str。将str应用于类型对象的结果只是一些字符串。例如:

>>> str(type(8))
"<class 'int'>"
>>> str(type(abs))
"<class 'builtin_function_or_method'>"
>>> str(type(lambda x: x + 1))
"<class 'function'>"
>>> str(type((1,2,3)))
"<class 'tuple'>"
>>> str(type(90.4))
"<class 'float'>"

设计类型的任何人都可以实现他们想要的str。现在大多数都遵循特定模式,正如您在C示例中所述。

现在,这是很酷的部分,因为类型是对象,它们可以分配给变量。 分配给它们的变量不必与应用str 时看到的类型名称有任何关系。例如,恰好将整数类型分配给int模块中的变量builtins。以下是一些例子:

>>> import builtins
>>> builtins.int
<class 'int'>
>>> int
<class 'int'>
>>> float
<class 'float'>
>>> complex
<class 'complex'>
>>> list
<class 'list'>
>>> import types
>>> types.FunctionType
<class 'function'>
>>> types.FunctionType == type(lambda x: x + 1)
True

我甚至可以这样做

>>> integer = float
>>> type(3.2) == integer
True

但不要。

TL; DR:一个是分配类型的变量,另一个是应用str的输出。没有规则说必须是一样的。当它们不同时,你必须询问类型的设计师。

关于它们如何相关,一般来说它们不能。但是大多数内置命名与其字符串输出的名称相同,types模块中的类型似乎具有大写的CamelCase名称。用户定义的类型的包名称以类名称为前缀。我不确定在所有情况下都必须遵循这条规则。