“类型/类/函数/模块/ ...对象”的含义是什么?

时间:2017-06-30 16:03:49

标签: python python-3.x

当我在Nutshell中阅读Python时,我看到了“类型对象”,“类对象”,“函数对象”,“模块对象”,....

“xxx对象”是指“xxx”类型的实例吗?

例如,

  • 类型对象是否意味着type类型的实例?例如,int是一个类型对象吗?是一个特定的类类型对象?

  • 一个类对象是什么意思?特定的类是一个类对象吗?例如,

      

    一个类是一个具有多个特征的Python对象:

         

    •您可以将类对象称为函数。   该调用通常称为实例化,返回一个称为的对象   班级的一个实例;这个类被称为   实例

         

    •一个类可以从其他类继承,这意味着它   委托其他类对象查找属性   在课堂上找不到。

  • 函数对象是否意味着types.FunctionType的实例?特定函数是函数对象吗?

  • 模块对象是否意味着types.ModuleType的实例?特定模块是模块对象吗?

  • 有一个int对象吗?如果是,它是否意味着12类型的整数值(例如int)?

感谢。

3 个答案:

答案 0 :(得分:4)

  

类型对象是否意味着type类型的实例?例如,int是一个类型对象吗?特定类是类型对象吗?

是的,“type”对象表示“type”类型的对象,ergo是该类型的实例。始终可以使用isinstance检查有关什么类型的信息。要回答第二个问题,inttype类型的对象:

>>> isinstance(int, type) # True

自定义类是否为对象类型:

>>> class Spammy: 
...     pass
>>> isinstance(Spammy, type)
True
  

类对象是否意味着什么的实例?特定的类是一个类对象吗?

在Python 2.2中Unification of types and classes之后,类对象的使用可与术语type对象互换。术语“类”主要用于引用用户定义的类(使用class语句创建的类),但它实际上意味着相同的事情。

这个确实在具有旧样式类的Python 2中有所作为。不从类定义中的对象继承,给出了类型为classobj的对象:

>>> class Foo:
...     pass
>>> type(Foo)
<type 'classobj'>

这在Python 3中不存在,其中所有类都是type类型的对象。

  

函数对象是否意味着types.FunctionType的实例?特定函数是函数对象吗?

     

模块对象是否意味着types.ModuleType的实例?特定模块是模块对象吗?

对所有这些都是肯定的:

>>> def foo(): pass
>>> type(foo)  
function 
>>> import collections    
>>> type(collections)
module
  

是否有int个对象?如果是,它是否表示12类型的整数值(例如int)?

有一个int类型,它是一个类型对象和一个int对象,它是int类型的对象。一个例子是12,因为:

>>> type(12)
int 

虽然int上的同样事情会产生:

>>> type(int)
type

答案 1 :(得分:3)

请参阅type()的文档:

  

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

     

建议使用isinstance()内置函数来测试对象的类型,因为它需要考虑子类。

让我们看看。 int是一个类型对象吗?

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

一个类对象意味着什么的实例?在Python 3中,类总是new-style classes,因此它们构成了自己的type

>>> class X:
...     pass
... 
>>> y = X()
>>> type(y)
<class '__main__.X'>

但是使用Python 2.x的旧式类:

>>> class X:
...     pass
... 
>>> y = X()
>>> type(y)
<type 'instance'>
>>> type(X)
<type 'classobj'>

这里,类有types.ClassType,实例有types.InstanceType(Python 3.x中都不存在)

函数对象是types.FunctionType

>>> def foo():
...    return 42
>>> type(foo) is types.FunctionType
True
>>> type(lambda x: x + 2) is types.FunctionType
True

模块对象是types.ModuleType

>>> import sys
>>> type(sys) is types.ModuleType
True

是的,有int个对象。考虑type(12)

答案 2 :(得分:1)

在Python中,您可以将类型表示为对象本身。所以是的,它们是类型对象。对于每种类型,都有一个表示该类型的对象,如int。它是类型本身的一个实例。

它类似于Java中的.getClass()Class<?>个对象:"some string".getClass() == String.class。 Java不会将函数视为第一类值,因此存在类似CallableConsumer<T>等类型的函数,但在Python中,函数具有特定类型,并且具有表示该类型的特定对象。 / p>