类型和对象原始对象之间的差异

时间:2017-02-25 13:20:29

标签: python python-3.x types

根据我对Python 3的理解,类型type是用于创建Class对象的元类,因此typeobject,因为“Car”是“Jaguar”,通过调用其__call__方法然后调用类的__new____init__方法,返回类本身的实例。

在正常水平,类型和对象之间的关系是完全有意义的;一切都是一个对象(子类object),一切都有一个类型;对象5的类型为intint的类型为type。因此isinstance(5, int)isinstance(int, type)都是正确的。但是,isinstance(5, type)不正确,因为5不是类对象,它是类的实例。

这篇文章:http://www.cafepy.com/article/python_types_and_objects/python_types_and_objects.html#object-type-example

因此将对象定义为只有一种类型。但是在非常原始的层面上,类typeobject本身,它们之间的关系让我困惑。 typeobject的子类,如__bases__所示,但object本身是type的实例。

如果描述像5这样的东西可以分成“肉”和“骨头”,其中“肉”代表它在内存中的实际创建并为其赋值,并“骨头”定义它应该如何,其价值和行为的合法范围,这是否意味着,type负责创建类对象的“肉”,object负责定义“骨骼” ?如果是这样,如果在这种情况下“骨头”是类int,那么创建类实例的“肉”是什么?

1 个答案:

答案 0 :(得分:4)

Python中的每个对象类都继承了object类的行为。首先,它意味着

>>> isinstance(x, object)
True
无论x碰巧绑定什么,

都将在Python 3中成立。它还意味着一切都将继承object的方法,除非被更具体的类覆盖。因此,如果x == yobject.__eq__都没有超越x方法,y将求助__eq__

Python 3中的

type也是一个对象 - 它继承自object:

>>> isinstance(type, object)
True

这意味着type是一个对象,它继承了object类的行为。这就是让人们写出像

这样的东西的原因
>>> type == type
True
>>> type.__eq__
<slot wrapper '__eq__' of 'object' objects>

type.__eq__继承自object类。

object类本身也是一种类型:

>>> isinstance(object, type)
True

这意味着作为对象的类object继承了type的行为 - type是对象的元类。

当然type的元类是类型:

>>> isinstance(type, type)
True

课程object也是object

>>> isinstance(object, object)
True

当你构造一个类的实例时,类本身负责该类的肉和骨骼,但也许可以区分为骨骼遵循普通的类继承,并且肉类在类之间分开和元类血统;并且元类也是类对象本身的骨骼。