Python的type内置类详解

news2024/11/27 22:29:35

目录导览

  • 欢迎来到本文
    • Type简介
    • Type的常见用法
      • 用法1-获取对象的类型
      • 用法2-创建新的类
    • Type做为元类(metaclass)
      • 元类的作用
      • 如何自定义元类

欢迎来到本文

Type简介

在Python中,type是一个内建的类,它是用于表示对象的类型的类。type类本身也是一个对象,它是所有类型对象的元类型(metaclass)

Type的常见用法

如官方文档所见,两种常见用法,相信不少朋友对第二种还不太熟悉
在这里插入图片描述

用法1-获取对象的类型

这应该是我们最常用的了,调用type(obj),会返回obj对象的类型对象,它的工作流程是什么呢?答:
在Python中,每个对象都有一个内部的数据结构,称为对象头(object header)。对象头包含一些元数据,如对象的引用计数和类型信息。类型信息用于确定对象的类型。
在C语言中,Python解释器定义了一个叫做PyObject的结构体来表示所有的Python对象。PyObject结构体中有一个成员叫做ob_type,它是一个指向类型对象(type object)的指针。调用type(obj)时,解释器会获取obj对象的对象头中的ob_type指针,并返回指向该类型对象的指针。这样就获得了对象的类型。

用法2-创建新的类

可以使用type类来动态创建新的类。type类的构造函数接受三个参数:类的名称、基类的元组和包含类的属性和方法的字典。通过调用type类的构造函数,可以动态地创建一个新的类对象。
例如,下面的代码使用type类创建了一个名为MyClass的新类:

MyClass = type('MyClass', (object,), {'x': 42, 'foo': lambda self: x+1})

该类没有显式的定义,而是通过type类的构造函数动态创建的。这个类具有一个属性x和一个方法foo。object表示要继承的基类,可为空
上述代码与下面的是等价的:

class Myclass(object):
	x=42
	def foo(self):
		return x+1

Type做为元类(metaclass)

元类的作用

在Python中,每个类都有一个元类,用于控制类的创建和行为。默认情况下,大部分类的元类都是type类,元类允许你在创建类时定制类的行为。通过定义自己的元类,你可以控制类的创建过程,包括修改类的属性、添加方法、拦截方法调用等

如何自定义元类

定义自定义元类,你需要创建一个类,并将其指定为你要创建的类的元类。自定义元类必须继承自type类或type类的子类。

class MyMeta(type):
    def __new__(cls, name, bases, attrs):
        # 在类创建之前执行的逻辑
        # 可以在这里修改类的属性和方法
        modified_attrs = modify_attrs(attrs)
        return super().__new__(cls, name, bases, modified_attrs)

MyMeta类继承自type类,并重写了__new__方法。__new__方法在类创建之前被调用,可以在这里修改类的属性和方法。然后,你可以使用这个自定义元类来创建其他类
使用自定义元类MyMeta创建类MyClass:

class MyClass(metaclass=MyMeta):
    x = 42

    def foo(self):
        return self.x

在类定义中指定了metaclass=MyMeta,这样MyClass的元类就是MyMeta。当创建MyClass类时,Python会使用MyMeta元类的__new__方法来处理类的创建过程

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

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

相关文章

(九)枚举器和迭代器(2)

一、Enumerator 接口 实现了 IEnumerator 接口的枚举器包含3个函数成员:Current、MoveNext 以及 Reset。 1)Current: 返回序列中当前位置项的属性。 只读属性。返回 Object 类型。可以返回对应的可枚举类型。 2)MoveNext&…

牛客网基础语法41~50题

牛客网基础语法41~50题😘😘😘 💫前言:今天是咱们第五期刷牛客网上的题目。 💫目标:熟练用数学知识来解决编程问题,会利用每种循环。 💫鸡汤:压抑了&#xff0…

8 个身份自动化模版,帮你提升企业身份治理效率

中大型企业的信息化建设已经成为了当前企业的主流趋势。随着日益增长的业务需求,中大型企业的信息系统逐渐发展成为一个拥有众多应用和数据库支撑的复杂体系。由于中大型企业员工众多,部门繁杂,且存在大量员工入、转、调、离等情况&#xff0…

springboot集成quartz

文章目录 前言一、Quartz是什么?难易程度 二、核心思想三、使用步骤1.引入依赖2.创建相应类 总结 前言 引用上一篇博客的说法 springboot整合xxl-job ,集群模式下,定时任务会造成很严重的事故,其次普通的任务也无法做到像xxl-job与Quartz 一样,及时启停,修改等;上一…

文心一言 VS 讯飞星火 VS chatgpt (41)-- 算法导论5.4 5题

五、在大小为n的集合中,一个k字符串构成一个k排列的概率是多少?这个问题和生日悖论有什么关系? 文心一言: 在大小为n的集合中,一个k字符串构成一个k排列的概率是1/k!,这是由于排列的总数是k!,而每个字符串被选中的…

十大开源 ChatGPT 替代品:弥合对话式 AI 的差距

聊天机器人彻底改变了企业与客户互动的方式。由 OpenAI 开发的最先进的 GPT-4 是该领域的主导者。但是,它不是开源的,这限制了开发人员复制结果或开发自己的类似于 GPT-4 的聊天机器人。 为了填补这一空白,开源社区已经开始提供 GPT-4 的替代…

Qt6.5.1+WebRTC学习笔记(十二)环境搭建流媒体服务器(ubuntu22.04+SRS)

前言 若只是实现一对一通信,仅使用webrtc就足够了。但有时间需要进行多个人的直播会议,当人比较多时,建议使用一个流媒体服务器,笔者使用的是SRS。 这个开源项目资料比较全,笔者仅在此记录下搭建过程 一、准备 1.操…

移远通信率先完成多场5G NTN技术外场验证,为卫星物联网应用落地提速

近日,由中国电信卫星公司牵头,移远通信联合紫光展锐、鹏鹄物宇等行业上下游合作伙伴,针对现有蜂窝通信在信号覆盖盲区,信息监测数据无法实时回传等痛点问题,以领先行业的速度开展了一系列的5G NTN(non-terr…

Unity入门7——物理系统之碰撞检测

一、刚体 Rigid Body ​ 刚体利用体积(碰撞器 Collider)进行碰撞计算,模拟真实的碰撞效果,产生力的作用 ​ 碰撞产生的必要条件: 两个物体都有碰撞器 Collider至少一个物体有刚体 Mass:质量 默认为千克&a…

postman自动化实战总结

Postman实战总结 简介 本次实战内容主要包括如下几点: l 背景介绍 l Postman使用,侧重于自动化实现,基础使用不做介绍 l 可视化Newman介绍 l 框架特色 l 实战中的坑 背景 随着国内软件技术的高速发展,越来越多的手工测试…

Qgis2threejs

three.js是JavaScript编写的一个开源的3D图形库,它可以用于创建各种各样的交互式3D应用程序和动画。该库提供了一系列的工具和功能,使得在Web浏览器中创建高质量的3D图形变得更加容易。 使用three.js,您可以轻松地创建3D场景,包括…

GoogleNet

Introduction 得益于深度学习的优势和更强大的卷积神经网络的出现,图像分类和目标检测的准确率发生了令人意想不到的进步。在2014年的ILSVRC比赛中,GoogLeNet取得了第一名的成绩,所用模型参数不足AlexNet(2012年冠军)…

基于Java医院住院管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

记录使用gswin64.exe合并多个pdf为一个pdf

目录 下载gs920w64.exe 安装 配置相关信息 验证是否安装配置成功 合并多个pdf文件 下载gs920w64.exe https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/tag/gs920 ​ 安装 正常安装,记住自己的安装目录: ​ 配置相关信息 安装…

限流与令牌桶

一、概述 令牌桶是一种常用的流量控制技术。令牌桶本身没有丢弃和优先级策略。 原理 1.令牌以一定的速率放入桶中。 2.每个令牌允许源发送一定数量的比特。 3.发送一个包,流量调节器就要从桶中删除与包大小相等的令牌数。 4…

跟着《代码随想录刷题》(六)—— 二叉树

6.1 二叉树的前、中、后序遍历 144.、二叉树的前序遍历&#xff08;中左右&#xff09; LeetCode&#xff1a;114、二叉树的前序遍历 &#xff08;1&#xff09;递归法 class Solution { public:void traversal(TreeNode* cur, vector<int>& vec) {if (cur N…

eslint + prettier如何搭配使用

简介 eslintprettier写代码爽到飞起&#xff0c;既规范了代码的格式&#xff0c;同时也让你的代码美观易读。本文介绍如何在项目中使用eslint搭配prettier来规范你的代码 1.eslint 和 prettier区别 先来回答一个问题&#xff0c;eslint和prettier这二者有啥区别&#xff0c;es…

【后端面经-数据库】MySQL的事务隔离级别简介

【后端面经-数据库】MySQL的事务隔离级别简介 0. 事务的概念1. 三类问题2. 事务隔离级别3. 操作指令4. 总结5. 参考博文 0. 事务的概念 事务指的是一连串的集中操作指令&#xff0c;一个事务的执行必须执行完所有的动作才能算作执行结束。事务具有四个特点&#xff0c;简记作A…

表示学习(Representation Learning) Part2--Auto-Encoders、VAEs、GANs

文章目录 Compression:Auto-EncodersCapture parameter distribution (variance): Variational Auto-Encoders原理介绍数学推导生成数据diffusion modelsPros&Cons Train using a second network: GANs 来自Manolis Kellis教授&#xff08;MIT计算生物学主任&#xff09;的…

spark_idea

spark_idea 3、打jar包运行2、code1、pom_xml0、创建数据、模型、预测表0、Windows配置scala环境 3、打jar包运行 ./bin/spark-submit \--class spark02 \--master spark://hadoop102:7077 \--deploy-mode client \/home/gpb/scala_spark2.jar打jar包、存储到虚拟机中 编写执行…