Python 3中对象与类的关系
我之前以为我明白了这个关系:在Python中,所有东西都是对象,每个对象都有一个类型。但是类又是什么呢?类就像是对象的蓝图,而对象是类的实例。不过我在一篇文章中看到,Python里的类本身也是对象。我一直以为对象是离不开它的蓝图——也就是类的。但是,如果类也是一个对象,那它是怎么存在的呢?
>>> type.__bases__
(<class 'object'>,)
>>> int.__bases__
(<class 'object'>,)
>>> str.__bases__
(<class 'object'>,)
那么,类object
就是每个对象的蓝图吗?
>>> type(str)
<class 'type'>
>>> type(int)
<class 'type'>
>>> type(type)
<class 'type'>
那么,类type
就是每种类型的蓝图吗?
但是type
本身也是一个对象。我实在搞不懂这一点。我无法想象类也是对象。
1 个回答
8
在Python中,任何可以命名的东西都是一个对象,包括函数、类和 metaclass(元类)。每个对象都有一个相关的 类型 或 类(在Python 3中,这两个词是一样的)。而这个类型本身也是一个对象,并且它也有自己的类型。类型的类型被称为 metaclass(元类),当然,也可以叫做 metatype(元类型),但后者这个词不常用。你可以使用 type()
来查看一个对象的类型。如果你不断地查询一个对象的类型、它的类型的类型,依此类推,最终你总会在某个时刻得到 type
这个类型,通常只需要两步:
type(3) # --> int
type(int) # --> type
type(type) # --> type
再举个例子,使用“元元类”:
class A(type):
pass
class B(type, metaclass=A):
pass
class C(metaclass=B):
pass
c = C()
type(c) # --> C
type(C) # --> B
type(B) # --> A
type(A) # --> type
type(type) # --> type
在 type
自身是 type
类型的这一点上,并没有矛盾。