在Python解释器中,当我输入类型名称xxx
时,我会得到类似<class 'yyy'>
的输出,其中yyy
和xxx
不相同。请参阅以下示例。
我想知道为什么yyy
和xxx
不同,它们分别是什么意思?感谢。
>>> 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'>
答案 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名称。用户定义的类型的包名称以类名称为前缀。我不确定在所有情况下都必须遵循这条规则。