CoderXL's Blog

Back

技术笔记与分享 →

接下来会看到几个非常掉 San 的例子。

为了证明这些例子不是 trivial 的,我们可以先跑一下这段比较正常的代码:

assert isinstance(1, int)
assert isinstance(1, object)
assert not isinstance(1, str)
assert not isinstance(int, int)

assert issubclass(bool, int)
assert not issubclass(int, bool)
assert not issubclass(int, str)
python

接下来,再看几个 tricky 的例子暖暖脑子:

assert issubclass(int, object)

assert isinstance(int, type)

assert not issubclass(int, type)

assert not isinstance(1, type)
python

经过了前面的铺垫,接下来请坐稳扶好,重磅来袭:

assert isinstance(int, object)
assert isinstance(type, object)
assert isinstance(object, object)

assert isinstance(type, type)
assert type(type) is type
assert isinstance(object, type)

assert issubclass(type, object)

assert not issubclass(object, type)
python

要理解这段代码的内涵,以及其反映的 Python 设计哲学,请记住以下几点:

  1. Python 中一切实体皆对象
    1. 类是对象
    2. 函数是对象
    3. 变量是对象
    4. 字面量是对象
  2. object 是一个类,表示对象。任何对象都是一个 object 实例。特别地,任何类都是一个 object 实例。
  3. type 是一个类,表示类型。任何类都是一个 type 的实例。特别地,object 是一个 type 的实例。
  4. 任何类都是一个 object 的子类,因为任何类实例都是一个 object 实例。特别地,type 是 object 的子类。
  5. type 是类型的类,则其子类是一部分类型的类。object 是一切的类,因此不是 type 的子类。
Comment seems to stuck. Try to refresh?✨