Python 3中对象与类的关系

1 投票
1 回答
1507 浏览
提问于 2025-04-16 12:07

我之前以为我明白了这个关系:在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 类型的这一点上,并没有矛盾。

撰写回答