【Python】深度理解Class类、Object类、Type元类的概念和关系

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

      • 1.Class类、Object类、Type元类的表面关系
      • 2.Class、Object、Type解释
      • 3.关系详解
      • 4.那么如何看待object、type在Python面对对象概念中的一席之地呢?
      • 5.那么object、type扮演了什么样的角色呢?他们对class又分别做了什么哪些动作?
      • 6.Python在代码层面也提供了一些方法去判断继承和类型
      • 总结:从事务看本质

提要:作为普通的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:是典型的面对对象编程的表现形式,为定义对象的属性、行为提供了一个模板。更多的使用场景还是在后台需要个体实例的情况下;一般的model层开发,几乎还是用的函数编程。
  • object:Python3中所有class的顶级父类,在class编程中,隐式的自动继承object,object类为其提供了一些内置函数。在我们Python3的开发中,已经不需要去关注object类。
print(list(object.__dict__.keys()))

在这里插入图片描述

  • type:type是所有对象的顶级类型。在class编程中,隐式的默认声明metaclass=type。

3.关系详解

  • class 与 object的关系:
    在Python3中,已经隐式的自动继承了object方法,所以我们平时编写的class的的默认内置方法其实是由object方法提供的,Python3中任何一个类都默认继承了Object,是不可改变的。并且每个class的顶级父类都是object。
  • class 与 type的关系:
    在Python3中,已经隐式的默认了元类是type类,所以每个class的顶级类型都是type类
  • object、type:本文的核心之一就是阐述object与type的关系。
    上述有一个比较绕的逻辑是object类是type的父类,而object类是type实例化而来,我想了很久怎么去解释和阐述这个逻辑,发现其实从Python的层面来讲已经解释不清了,于是翻到了C的源码,又查了很多资料,翻了很多博客。这里我想结合所有所得总结一些信息:不用去深究object和type的深度关系是什么,除非你想去看完C的PyObject部分,我相信对绝大多数人来讲结果一定是戛然而止的。那么我们只需要知道type的父类是object,object的类型是type便好;也就是我上面说的所有类的顶级类型是type,所有类的顶级父类是object。所以,他们之间与其说是有所关系,不如说是相互协作。下面我会详解他们是如何协作的

4.那么如何看待object、type在Python面对对象概念中的一席之地呢?

这里引用这位博主的一句话。
可以把二者理解为是两个体系的王者,object是站在继承关系顶点的存在,所有的类最后都是继承自object的,object没有父类了,所以这里输出为空(),object是type类型的,也就是说type是站在类型关系顶端的存在,所有的类型都难逃type类型的掌握,所以object和type自己的类型都是type,type的父类是object。
我个人觉得这样的解释也算合理,对普通的开发人员而言已经足够。但如果你想做更加高级的动作,一定要看看下文;皆在我对继承、类型和抽象的理解。

5.那么object、type扮演了什么样的角色呢?他们对class又分别做了什么哪些动作?

object让类有了可以代代相传的通道,可以继承和实例化延续下去,它延续了一个技能,就需要元类,元类里面可以定制类的行为,比如重写__new__或者__init__等方法,就像基因编辑一样,制造出一个按照我们要求工作的娃娃。。
与其说object、type扮演了什么角色,不如讲什么是继承,什么是类型。事实上,Python对此的命名和抽象非常有水平,我想换一种类比去解释这个概念,这里的继承和类型放在中华概念中可以解释为 行为传承和物种生成(通俗点说,就是你向谁学东西,谁创造了你)(在此不得不惊叹guido对Python的审美已经到了极其优雅的程度,让人叹为观止),行为传承让成型的物种有了可以将技能代代相传的通道。那么成型的物种怎么理解呢:既然是物种,那么总有个发育和成型的过程吧。而type就是用来控制这个发育过程的直到它物种成型,然后继承行为,所以从执行顺序上讲object是在type之后。那么type在代码层面又是如何做的呢?我们从下面这个例子看一下:

class MyMeta(type):def __new__(cls, *args, **kwargs):print("元类中的__new__被调用")return super(MyMeta, cls).__new__(cls, *args, **kwargs)def __init__(self, *args, **kwargs):print("元类中的__init__被调用")return super(MyMeta, self).__init__(*args, **kwargs)def __call__(self, *args, **kwargs):print("元类中的__call__被调用")return super(MyMeta, self).__call__(*args, **kwargs)class MyClass(metaclass=MyMeta):def __new__(cls, *args, **kwargs):print("主类中的__new__被调用")return super(MyClass, cls).__new__(cls, *args, **kwargs)def __init__(self, *args, **kwargs):print("主类中的__init__被调用")return super(MyClass, self).__init__(*args, **kwargs)def __call__(self, *args, **kwargs):print("主类中的__call__被调用")return super(MyClass, self).__call__(*args, **kwargs)print("-------------------------\n创建具体的对象前\n----------------------------------")
m = MyClass()
元类中的__new__被调用
元类中的__init__被调用
-------------------------
创建具体的对象前
----------------------------------
元类中的__call__被调用
主类中的__new__被调用
主类中的__init__被调用

相信上图已经非常明了。在MyClass代码被加载进内存的时候就已经执行了元类的相关函数,这个过程其实就是物种发育成型。所以在我们平时的普通开发中,几乎都是基于物种发育成型后赋予相关技能行为的代码编写。而这种控制物种发育的过程,在Python代码层面叫做元编程。
执行顺序:
元类:new、init、call、 子类new、init、call。注意每个函数的第一个参数都是由上一个函数执行的返回结果,new的第一个参数是外部返回的结果,声明cls,其他函数的第一个参数是内部函数返回的结果声明为self,这种命名是guido做的一种范式,这样的命名设计是合理的。

6.Python在代码层面也提供了一些方法去判断继承和类型

提供了内置函数isinstance去比较类型关系;
提供了内置函数issubclass去比较继承关系;
提供了type()去判断类型;
提供了对象的__base__()方法去获取上一级的父类

总结:从事务看本质

object和type的产生本身就是一种自然抽象。其实从汇编、C、面向过程、面向对象这一路演化都是为了抽象,包括造轮子,语言生态,其实都是抽象的具体表现。那么殊途同归,从硬件到软件一路走来,所有动作都是抽象,它不是创造,而是优化,但某些优化趋近于创造。软件设计思想,其实都是从自然、人文等关系演化类比而来。软件思想就是一方世界,是自然的产生,是真实世界的映射,它和我们一样,在进步、在进化,与我们并肩前行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/352779.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

MongoDB(学习笔记1.0)

最近在学非关系型数据库MongoDB,猛地用起来的真的没关系型数据库方便啊。 首先还是数据库的安装: 安装直接去官网安装即可,官网地址:MongoDB: The Developer Data Platform | MongoDB 当前也有免安装版的,这里就不再…

京东数据分析软件工具(京东618销量查询)

这一期,我们主要分享今年618京东美妆的预售数据,包括面部护肤、香水彩妆、男士面部护肤品类。 -面部护肤- 今年618,面部护肤品类在京东累计预售量达到130万件,预售额达到13亿元。预售期间,护肤品类均价在1010元左右。期…

Android 使用第三方字体

先看下图 一.全局替换方式 1.新建assets引入资源 2. 自定义application,将第三方的字体,替换当前系统默认字体 class App : Application() {override fun onCreate() {super.onCreate()initTypeface()}private fun initTypeface() {val typefaceByson…

Android 字体大小(fontScale)不随系统设置变化

需求 App字体大小不变 如果用户将系统字体大小设置的非常大,可能导致APP的文字大小显示异常。 目标效果是,APP内字体大小不随系统设置的 字体大小 变化。 原始效果 系统的字体大小设置为 超大 时:(字体大小 可变) 目…

Android 自带的字体库、字体样式

1、设置字体 android:fontFamily“字体样式” 1、sans-serif-smallcaps (左边只设置字体,右边设置加粗) 2、sans-serif 3、cursive 4、sans-serif-black 5、sans-serif-condensed-light 6、sans-serif-thin 7、serif 8、serif-monospa…

android屏幕大小字体大小,Android字体大小自适应不同分辨率的解决办法

Android字体大小自适应不同分辨率的解决办法 今天有人问我,Android系统不同分辨率,不同大小的手机,字体大小怎么去适应呢?其实字体的适应和图片的适应是一个道理的。 一、原理如下: 假设需要适应320x240,48…

Android切换字体

有时候需要根据UI需求切换项目字体&#xff0c;步骤如下&#xff1a; 准备字体文件&#xff0c;示例使用ttf文件&#xff0c;新建font文件夹&#xff1a; 将ttf文件放到res/font目录下 设置全局字体&#xff0c;系统主题添加 <item name"android:fontFamily">f…

Android 字体颜色设置及颜色表

1、在android中经常看到设置的颜色为八位的十六进制的颜色值&#xff0c;例如&#xff1a; public static final class color { public static final int lightblue0x7f040000; } 或者在Java中tx.setTextColor(0xffff00f); 说明&#xff1a; 0xffff00ff是int类型的数据&#…

IOS字体与安卓字体渲染不一致

IOS字体与安卓字体渲染不一致 问题: 前端开发中经常会遇到各种各样的兼容问题,记录一次IOS字体与安卓字体渲染不一致,当字体包名字中包含’-Bold’时 错误代码如下: font-family: DINAlternate-Bold ; font-weight: bold;IOS: 不会渲染’font-weight: bold’只是加载了’…

android中文字体加粗,android TextView设置中文字体加粗实现方法

android TextView设置中文字体加粗实现方法 英文设置加粗可以在xml里面设置: 复制代码 代码如下: android:textStyle="bold" 英文还可以直接在String文件里面直接这样填写: 复制代码 代码如下: Plain, bold, italic, bold-italic b代码加粗,i代表倾斜 中文设置加粗就…

android常用字体代码,Android TextView设置字体风格多种组合

在开发应用过程中经常会遇到显示一些不同的字体风格的信息犹如默认的LockScreen上面的时间和充电信息。对于类似的情况,可能第一反应就是用不同的多个TextView来实现,对于每个TextView设置不同的字体风格以满足需求。 这里推荐的做法是使用Android.text.*;和android.text.sty…

Android 字体粗细的设置

转载:https://juejin.im/post/597d88f75188257fc2177c36 如何实现 “中间这几个字要加粗&#xff0c;但是不要太粗&#xff0c;比较纤细的那种粗” &#xff1f; 分享一个最近做业务遇到的简单又蛮有意思的的文本显示处理过程。具体就是有这么一段文字&#xff0c;类似“转盘…

Android字体引入

2个方案&#xff1a;①xml引入、②java代码引入。 效果图&#xff1a; 方法①&#xff1a;xml引入&#xff1a; 1.创建font目录&#xff1a; 2.把字体库复制到font目录下&#xff1a; 3.xml中&#xff0c;使用fontFamily引入字体库&#xff1a; <TextViewandroid:text"…

Android字体样式修改

效果图 准备字体 Download Alibaba Sans比如阿里巴巴普惠体&#xff0c;也可以其他网站找一些对应的资源。 字体使用 将字体文件放到res/font文件夹下&#xff0c;如果没有font文件&#xff0c;则新建一个。 添加到font路径下的字体文件&#xff0c;明明不能是汉字&#xff…

玩转安卓字体

起因 最近公司有个需求&#xff0c;需要做 Widget &#xff0c;内心其实是拒绝的&#xff0c;因为这个玩意儿特别难用&#xff0c;而且限制重重&#xff0c;但没办法&#xff0c;也不能不做&#xff0c;那就开始吧。 本来以为挺简单的东西&#xff0c;一个列表展示数据&#…

iPadPro看电影之MKV转MP4视频格式教程

拥有了苹果iPadPro如果不看高清电影那就有点可惜了&#xff0c;虽说在线看电影也不错&#xff0c;但就目前这种网络环境&#xff0c;还别说很多时候没有Wifi网络&#xff0c;即使能上网很多时候网速也无法支持流畅的在线播放普清电影&#xff0c;更不用说高清电影了。怎么办&am…

如何向ipad上传视频(使用iTunes)

1.先对iTunes做个简单介绍&#xff1a; iTunes是一款媒体播放器的应用程序&#xff0c;2001年1月10日由苹果电脑在旧金山的Macworld Expo推出&#xff0c;用来播放以及管理数字音乐和与视频文件。iTunes能连接到iTunes Store&#xff0c;以便下载购买的数字音乐、音乐影片、电视…

Mac电脑使用:通过Mac电脑导出iPhone手机里面的视频(不是iTunes导出视频的方法)

分享一个通过Mac电脑导出iPhone手机里面的视频的方法,这个方法和通过iTunes导出手机视频的方法是并行关系。 方法很简单,就是通过Mac电脑系统里面自带的图像捕捉工具来操作。 具体步骤如下所示: 1.把iPhone手机连接到你的Mac电脑上面,然后打开Launchpad; 2.在Launchpad中找…

苹果手机iphone如何播放电脑中的视频

用手机看视频已经是人们习以为常的事情了&#xff0c;随着手机容量的增大&#xff0c;很多人选择把视频下载到手机本地观看&#xff0c;但是有些视频我们存放在电脑上&#xff0c;想用手机看怎么办呢&#xff1f;很多人选择把视频用数据线传输到手机上&#xff0c;但是这样略显…

如何在IPad上优雅地看移动硬盘中的视频

这里用到的是SMB协议&#xff0c;Win10自带 文章目录 如何开启SMB如何共享文件如何在IPad上访问共享文件如何在IPad上看视频呢&#xff1f; 如何开启SMB 众所周知&#xff0c;windows的SMB默认是关闭的&#xff0c;下文首先介绍如何开启首先&#xff0c;进入控制面板-程序&…