【问题标题】:Difference between type and object primitive objects类型和对象原始对象之间的区别
【发布时间】:2017-07-16 08:16:57
【问题描述】:

根据我对 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,那么创建类实例的“肉”等价物是什么?

【问题讨论】:

  • object 实际上只是 Python 支持的所有对象的通用属性集,因此我将 object 称为实例/类/元类的“裸骨”。一个类(如int)实际上只是向下一层类型的扩展。 type 规定了类可以做什么和不能做什么,而类规定了实例可以做什么和不能做什么。
  • 对,但是是否可以在影响他们创建的类的实例的元类中放入属性?

标签: python python-3.x types


【解决方案1】:

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

>>> isinstance(x, object)
True

无论 x 碰巧绑定到什么,在 Python 3 中都是正确的。这也意味着一切也将继承object 的方法,除非被更具体的类覆盖。因此,如果xy 都没有覆盖__eq__ 方法,x == y 将求助于object.__eq__

Python 3 中的type 也是一个对象——它继承自对象:

>>> 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

当你构造一个类的实例时,类本身负责该类的肉和骨头,但也许可以将区别在于骨头遵循普通的类继承,而肉在类之间分割和元类谱系;而元类也是类对象本身的骨骼。

【讨论】:

  • 在绘制这种区别时是否意味着尽管任何元类沿袭(默认情况下,内置或自定义元类)仅定义类对象本身的实例化,但它们仍然可以勾勒模板每个实例?我可以澄清一下元类是否可以定义它们各自的类对象和类实例可能调用的方法?
  • 元类可以定义类对象可以调用的方法;他们可以使用实例具有的方法扩展类对象本身,但不能直接扩展。因为类的实例不是元类的实例。
  • 即“Mercato”是“Human”,“Human”是“Species”并不意味着“Mercato”是“Species”。
  • “他们可以使用实例拥有的方法扩展类对象本身,但不能直接”你能澄清一下吗?实例可以调用这些方法吗?
  • 这里的问题不是“是否可以调用它们”,而是它们是否容易显示在实例上。
猜你喜欢
  • 1970-01-01
  • 2013-01-26
  • 2014-03-22
  • 1970-01-01
  • 2013-05-19
  • 2015-03-31
  • 2017-10-04
  • 1970-01-01
  • 2014-10-19
相关资源
最近更新 更多