Python - 数据模型 - 子类与实例

时间:2017-06-02 12:41:11

标签: python python-2.7 python-3.x

对于用户定义的类型X

>>> class X(object):
...     pass
... 
>>> issubclass(X, object)    # User-defined type
True
>>> isinstance(X, object)    # User-defined type
True

问)X如何表现为object的子类和实例?

>>> issubclass(int, object)  # Built-in type
True
>>> isinstance(int, object)  # Built-in type
True

问)int如何表现为object的子类和实例?

>>> issubclass(type, object)  # Meta class
True
>>> isinstance(type, object)  # Meta class
True

问)type如何成为object的子类和实例?

>>> issubclass(object, type)
False
>>> isinstance(object, type)
True

object不是子类,而是type的实例,这是有道理的

>>> issubclass(int, type)
False
>>> isinstance(int, type)
True
>>> 

int不是子类,而是type的实例,是有道理的。

>>> issubclass(X, type)      # User-defined type
False
>>> isinstance(X, type)      # User-defined type
True

也很有道理。

修改

here它说,引入新式类的主要动机是提供一个带有完整元模型的统一对象模型。

Q)如何理解统一对象模型的含义?

Q)什么是元模型

Q) type type的实例是什么意思?

3 个答案:

答案 0 :(得分:5)

你提出的所有三个问题都归结为“X如何成为object的子类和实例”。答案很简单:一切object的子类。类是对象(= object的实例),因此,子类(包括object的子类)也是object的实例。

答案 1 :(得分:4)

可能更容易理解图解:

enter image description here

我使用A到B的红色箭头表示A.__class__ == B,黑色箭头表示B in A.__bases__。 python中的每个对象都必须有一个红色箭头,但只有type的实例有一个黑色箭头。

粗略地说

  • issubclass(x, y)表示“从x开始,按下黑色箭头,直至到达y

  • isinstance(x, y)表示“从x开始,按一个红色箭头,然后应用issubclass

编辑:另一个使用元类的示例:

class MetaClass(type): pass
class MClass(metaclass=MetaClass): pass
class Class(object): pass
c = MClass()

enter image description here source

答案 2 :(得分:1)

Python中的所有内容都是一个对象,而isinstance(whatever, object) == True只是一种说法。因此,常规对象和任何类型都是按对象设计的实例。有些类继承了对象以提供额外的功能(在Py3k中所有这些都是真的),例如typeobject的子类,它产生另一种类型作为实例,比方说,Inttype(和object)的子类,为实例化整数量身定制。 所以你可能会问 - 为什么有一个python对象object,为什么这甚至是你可以传递的东西等等。答案是 - mro,老兄。事实证明类型object提供了一组方便的描述符,这些描述符被调用为大量其他类型的默认值(因为类型最终会继承object中的大多数功能)。