深度理解Python中Class类、Object类、Type元类
作者:会振刀的程序员 发布时间:2022-07-14 03:10:13
提要:作为普通的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__)
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()))
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


猜你喜欢
- 废话不多说了,直接上代码吧!#!/usr/bin/env python# coding=utf-8# 画一棵樱花import turtlei
- 一、前言你知道当我们在网页浏览器的地址栏中输入 URL 时,Web 页面是如何呈现的吗?Web 界面当然不会凭空出来,根据 Web 浏览器地
- 本文实例讲述了Python模拟简单电梯调度算法。分享给大家供大家参考,具体如下:经常在公司坐电梯,由于楼层较高,是双联装的电梯,但是经常等电
- 需要在 ~/.pip/pip.conf 配置文件中加入下面的语句,避免这类警告:没有目录或没有配置文件需要自己新建mkdir ~/.pip/
- 这次这个真的是干货哦,昨晚弄了半晚上,,,,从8点吃完饭就开始写,一直到了快12点才弄好,,,新手,伤不起呀。。。。先简单的说下吧,百度提供
- 计算年、月、日需要安装组件包pip install python-dateutil当前日期时间import datetimeprint da
- 这篇文章主要介绍了python全局变量引用与修改过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- Python的json模块提供了一种很简单的方式来编码和解码JSON数据。 其中两个主要的函数是 json.dumps() 和 json.l
- 在web页面中,图片居左,内容居右排列,是非常常见的效果,它也就是媒体对象,它是一种抽象的样式,可以用来构建不同类型的组件,在bootstr
- 做表单验证的时候是否会碰到验证某个输入框内只能填写数字呢,仅允许输入整数数字或者带小数点的数字。下面这段代码也许能帮到你!通过对当前输入框定
- 前言在前面的分享中,我们制作了一个天眼查 GUI 程序,今天我们在这个的基础上,继续开发新的功能,微博抓取工具,先来看下最终的效果整体的界面
- MySQL ALTER语法如下:ALTER [IGNORE] TABLE tbl_name alter_spec [, alter_spec
- Hello 大家好,我是TANZAME,我们又见面了。NuGet是什么这里就不再重复啰嗦,园子里一搜一大把。今天要跟大家分享的是,在日常开发
- 本文实例讲述了vue+php实现的微博留言功能。分享给大家供大家参考,具体如下:html部分:<!doctype html>&l
- 存储过程中的TOP后跟一个变量会如何? Create proc getWorkPlan2 (@intCounter int ,@lngUse
- 本文实例讲述了Symfony2之session与cookie用法。分享给大家供大家参考,具体如下:session操作:1. Set Sess
- 开发工具**Python版本:**3.6.4相关模块:pyecharts模块;以及一些Python自带的模块。环境搭建安装Python并添加
- Python中pack()方法#Copyright (c)2017, 东北大学软件学院学生# All rightsreserved#文件名称
- 一、游戏展示所谓:开局一张图,后面全靠编。先放图片、动画展示一波。游戏玩法很简单,按空格猴子↑跳起来,躲开巨浪袭击,时间越
- 本文为大家分享了python实现扫雷游戏的具体代码,供大家参考,具体内容如下本文实例借鉴mvc模式,核心数据为model,维护1个矩阵,0表