对于用户定义的类型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
的实例是什么意思?
答案 0 :(得分:5)
你提出的所有三个问题都归结为“X如何成为object
的子类和实例”。答案很简单:一切是object
的子类。类是对象(= object
的实例),因此,子类(包括object
的子类)也是object
的实例。
答案 1 :(得分:4)
可能更容易理解图解:
我使用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()
答案 2 :(得分:1)
Python中的所有内容都是一个对象,而isinstance(whatever, object) == True
只是一种说法。因此,常规对象和任何类型都是按对象设计的实例。有些类继承了对象以提供额外的功能(在Py3k中所有这些都是真的),例如type
是object
的子类,它产生另一种类型作为实例,比方说,Int
是type
(和object
)的子类,为实例化整数量身定制。
所以你可能会问 - 为什么有一个python对象object
,为什么这甚至是你可以传递的东西等等。答案是 - mro
,老兄。事实证明类型object
提供了一组方便的描述符,这些描述符被调用为大量其他类型的默认值(因为类型最终会继承object
中的大多数功能)。