网络编程
位置:首页>> 网络编程>> Python编程>> 深度理解Python中Class类、Object类、Type元类

深度理解Python中Class类、Object类、Type元类

作者:会振刀的程序员  发布时间:2022-07-14 03:10:13 

标签:Python,Class类,Object类,Type元类

提要:作为普通的Python开发者来讲,深入理解object、type不是必要的,但了解他们确实

元编程这个词很多朋友都听过,可能用的却不多。其实它的使用主要使用场景还是在组件研发和框架研发。但是我还是推荐大家务必对元编程有一个基础的认识和了解,我相信它一定可以将的编码和理解能力拔高一层。我将深入浅出的引出一些元编程所需的基础知识来帮助大家入门。

1.Class类、Object类、Type元类的表面关系

  • object:object类是所有类(class)的父类,包括type类,object类的父类为空

  • type:type类是所有类的类型,即为所有类(class)都可由type实例化而来,包括type类和父类object。

  • class:继承自object,同时,由type进行实例化。其中,type就是我们所讲的元类(metaclass)

print('type的父类是:',type.__base__)
class test:
   pass
print('class的父类是:',test.__base__)
print('object的父类是:',object.__base__)

深度理解Python中Class类、Object类、Type元类

2.Class、Object、Type解释

class:是典型的面对对象编程的表现形式,为定义对象的属性、行为提供了一个模板。其实说白了就是用来写业务的

  • object:Python2中,创建类需要显示声明object方法才会继承,若不声明,则不继承。这里我们不再过多讨论Python2。在Python3中,已经隐式的自动继承了object方法,所以我们平时编写的class默认类方法其实是由object方法提供的,Python3中任何一个类都默认集成了Object,不可改变。我们通过下图看看object类到底有多少内置函数,分别是谁?并将解析他们中主要成员。

1.1关系详解

object、type:本文的核心之一就是阐述object与type的关系。
1、上述有一个比较绕的逻辑是object类是type的父类,而object类是type实例化而来,我想了很久怎么去解释和阐述这个逻辑,发现其实从Python的层面来讲已经解释不清了,于是翻到了C的源码,又查了很多资料,翻了很多博客。这里我想结合所有所得总结一些信息:不用去深究object和type的深度关系是什么,除非你想去看完C的PyObject部分,我相信对绝大多数人来讲结果一定是戛然而止的。那么我们只需要知道type的父类是object,object的类型是type便好。

2、那么如何看待object、type在Python面对对象概念中的一席之地呢?这里引用这位博主的一句话。
可以把二者理解为是两个体系的王者,object是站在继承关系顶点的存在,所有的类最后都是继承自object的,object没有父类了,所以这里输出为空(),object是type类型的,也就是说type是站在类型关系顶端的存在,所有的类型都难逃type类型的掌握,所以object和type自己的类型都是type,type的父类是object

3.Object类的默认方法作用详解

前言提要:默认类方法是从何而来呢!Python2中,创建类需要显示声明Object方法才会继承,若不声明,则不继承;Python3中,已经隐式的自动继承了Object方法。所以我们平时编写的class默认类方法其实是有object方法提供的,Python3中任何一个类都默认集成了Object,不可改变。我们通过下图看看object类到底有多少内置函数,分别是谁?并将解析他们中主要成员。

print(list(object.__dict__.keys()))

深度理解Python中Class类、Object类、Type元类

3.1 init

详解:构造方法,这是从其他语言借鉴过来的术语。作用:当类实例被创造后调用的方法,所以更严格来讲应叫做 初始化方法,而不是构造方法。但通常很多同学会把它叫做构造方法,其实是不对的,因为Python中的构造方法另有其人,它就是new方法。

3.2 new

详解:用于构建实例的特殊方法。关于这个方法咱不用再进一步深究,除非你想去看看CPython源码。它返回一个实例,这个实例会作为第一个参数(即self)传给init方法,所以init方法的第一个self参数其实是这样得到的,而new便是真正构造类实例的方法。通常我们几乎不需要自己编写new方法,因为从object类集成的实现已经足够了。

3.3 repr

详解:__repr__()会返回和调用者有关的“类名+object at+内存地址”。所以我们在执行类的实例化之后返回了一个实例实际上就是调用了repr函数。当然它从道理上来讲也可以重写,但是建议最好不要动它,因为确实没有什么重写的必要。还是那句话,所有的动作皆为业务而生,反之就不要产生动作。

3.4

  • isinstance

  • issubclass

  • 论述 继承与类型 的关系

  • type.new方法创建实例

来源:https://blog.csdn.net/l782060902/article/details/130992605

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com