美文网首页js css htmlPython
Python - object与type,继承与类型

Python - object与type,继承与类型

作者: 红薯爱帅 | 来源:发表于2023-03-10 13:51 被阅读0次

1. 概述

在Python的世界中,object是父子关系的顶端,所有的数据类型的父类都是它;type是类型实例关系的顶端,所有对象都是它的实例。
它们两个的关系可以这样描述:

  • object是一个type,object is an instance of type,即object是type的一个实例。
>>> object.__class__
<type 'type'>
>>> object.__bases__ # object 无父类,因为它是链条顶端。
()
  • type是一种object, type is a kind of object,即type是object的子类。
>>> type.__bases__
(<type 'object'>,)
>>> type.__class__ # type的类型是自己
<type 'type'>

object和type的关系很像鸡和蛋的关系,先有object还是先有type没法说,obejct和type是共生的关系,必须同时出现的

type,所有class都是由type创建,继承type的class称之为元类metaclass,可称为:万类之母
object,所有class的基类,即所有class继承于object,可称为:万类之父

2. 父类与母类

继承与类型

  • 第一列是元类metaclass
  • 第二列是object列,即类的定义,包含__bases____class_
  • 第三列是类的实例


    蓝色表示继承,红色表示类型

直接父类__bases__,即继承于谁

Python 为所有类都提供了一个__bases__属性,通过该属性可以查看该类的所有直接父类,该属性返回所有直接父类组成的元组

class M(type):
    pass
class A(metaclass=M):
    pass
class B:
    pass
class C(A, B):
    pass

print('类A的所有父类:', A.__bases__)
print('类B的所有父类:', B.__bases__)
print('类C的所有父类:', C.__bases__)
类A的所有父类: (<class 'object'>,)
类B的所有父类: (<class 'object'>,)
类C的所有父类: (<class '__main__.A'>, <class '__main__.B'>)

直接母类__class__,即谁创造了它

class M(type):
    pass
class A(metaclass=M):
    pass
class B:
    pass
class C(A, B):
    pass

print(A.__class__)
print(B.__class__)
print(C.__class__)

print(A().__class__)
print(B().__class__)
print(C().__class__)
<class '__main__.M'>
<class 'type'>
<class '__main__.M'>
<class '__main__.A'>
<class '__main__.B'>
<class '__main__.C'>

3. 三个常用的类型检查函数

  • isinstance(obj, class_or_tuple):检查 obj 是否为后一个类或元组包含的多个类中任意类的对象
  • issubclass(cls, class_or_tuple):检查 cls 是否为后一个类或元组包含的多个类中任意类的子类
  • type(obj):返回object的类型
>>> class A: pass
... 
>>> class B(A): pass
... 
>>> type(A())
<class '__main__.A'>
>>> type(A()) == A
True
>>> type(B()) == B
True
>>> isinstance(B(), B)
True
>>> isinstance(B(), A)
True
>>> isinstance(A(), A)
True
>>> isinstance(A(), B)
False
>>> issubclass(A, B)
False
>>> issubclass(B, A)
True
>>> issubclass(B, B)
True
>>> issubclass(B, type)
False     <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>> issubclass(B, object)
True

>>> isinstance(B, type)
True        <<<<<<<<<<<<<<<<<<<<<<<<< B是type创建的,所以True
>>> isinstance(B(), type)
False      <<<<<<<<<<<<<<<<<<<<<<<<< B的实例不是type创建的,所以False
>>> isinstance(B, object)
True
>>> isinstance(B(), object)
True
  • 类型,type
>>> type(str)
<class 'type'>
>>> type('xxx')
<class 'str'>

>>> type(list)
<class 'type'>
>>> type([1,2,3])
<class 'list'>
  • 实例,isinstance
>>> isinstance(int, object)
True
>>> isinstance(str, object)
True
>>> isinstance(list, object)
True
>>> isinstance(type, object)
True
>>> isinstance(object, object)
True

>>> isinstance(str, type)
True
>>> isinstance(list, type)
True
>>> isinstance(int, type)
True
>>> isinstance(object, type)
True
>>> isinstance(type, type)
True
  • 子类,issubclass
>>> issubclass(str, object)
True
>>> issubclass(int, object)
True
>>> issubclass(list, object)
True
>>> issubclass(dict, object)
True
>>> issubclass(type, object)
True
>>> issubclass(object, object)
True

相关文章

网友评论

    本文标题:Python - object与type,继承与类型

    本文链接:https://www.haomeiwen.com/subject/kslxldtx.html