元类的介绍和元类创建类

【一】什么是元类

元类是所有类的基类,包括object

class Solution:...
​
​
print(type(Solution))   # <class 'type'>
print(type(dict))       # <class 'type'>
print(type(object))     # <class 'type'>
​
data = {'username':'dream'}
print(type(data))       # <class 'dict'>

【二】直接使用type生成

【1】直接用关键字创建

正常创建类的方式 class 类名():类体代码

【2】直接使用 type 生成

类名 = type('类名',(父类1,父类2),名称空间字典)

class Student(object):...
​
​
print(Student)          # # <class '__main__.Student'>
​
Student = type('Student',(object,),{'name':'knight'})
print(Student)          # <class '__main__.Student'>
print(type(Student))    # <class 'type'>
# 如果是类的名称空间字典,一定会看到出来自己定义的属性以外的很多属性,这是自带的属性
# 如果是对象的名称空间字典,一定会只有__init__初始化后的属性
print(Student.__dict__)     # {'name': 'knight',

【三】元类的使用

元类可以在创建类的过程中进行修改和增加

# 控制当前类名必须首字母大写!首字母不大写就报错!
# 【1】创建元类
class MyType(type):def __init__(cls,class_name,class_bases,class_name_space):# cls 是当前类的本身print(f'cls:{cls}')     # cls:<class '__main__.MyClass'># class_name 是当前类的类名# 首字母必须大写其他必须小写,否则报错print(f'class_name:{class_name}')   # class_name:MyClassif not class_name.istitle():raise TypeError(f"首字母必须大写")# class_bases 当前类的父类print(f'class_bases:{class_bases}')     # class_bases:()# class_name_space 当前类的名称空间print(f'class_name_space:{class_name_space}')      # class_name_space:{'__module__': '__main__', '__qualname__': 'MyClass'}super().__init__(class_name,class_bases,class_bases)
​
​
# 【2】创建一个继承元类的类
# metaclass 指定元类
class MyClass(metaclass=MyType):...
​
class student(metaclass=MyType):...

【四】元类的进阶使用

class MyType(type):def __init__(cls, class_name, class_bases, class_name_space):super().__init__(class_name, class_bases, class_name_space)
​# 3.触发元类中的__call__def __call__(self, *args, **kwargs):# 4.打印三个参数# 当前类本身print(f"{self}")  # <class '__main__.MyClass'># 类实例化的时候传进来的位置参数print(f"{args}")  # ('knight',)# 类实例化的时候传进来的关键字参数print(f"{kwargs}")  # {'age': 22}print(f"类名()触发MyType中的__call__")  # 类名()触发MyType中的__call__# 加了这个判断,下面就必须使用关键字传参if args:raise TypeError(f"必须通过关键字传参数")# 5.如果不返回值就默认输入none# 一定要返回一个对象 ,直接把type拿过来用# 所以用super().__call__()# super() 其实就是typeobj = super().__call__(*args, **kwargs)print(f"obj:{obj}")  # obj:<__main__.MyClass object at 0x00000140C105FD90># 6.返回当前对象return obj
​
​
# 1.触发MyType的__init__方法
class MyClass(metaclass=MyType):def __init__(self, name, age):self.name = nameself.age = age
​def __call__(self, *args, **kwargs):print(f"myclass的对象()触发了__call__")
​
​
# 2.对象(参数)调用,一定会触发MyType的__call__方法
# 7. me 接收的就是MyType的 __call__ 方法返回的obj对象
me = MyClass(name='knight', age=22)     # 因为上面加了判断,这里就不能只写'knight',要改为name='knight',否则报错
print(me())  # myclass的对象()触发了__call__
print(me.name)  # knight

总结

如果你想高度定制类的生产过程,那么编写元类里面的__init__方法

如果你想高度定制对象的生产过程,那么编写元类里面的__call__方法

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

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

相关文章

为什么Python中会有集合set类型?

知乎上有人提问&#xff0c;为什么Python有了列表list、元组tuple、字典dict这样的容器后&#xff0c;还要弄个集合set&#xff1f; 确实set和list、tuple、dict一样&#xff0c;都是python的主要数据类型&#xff0c;它们的作用是不同的。 因为set是数学意义上的集合&#xf…

四、基于Stage模型的应用架构设计

前面我们了解了如何构建鸿蒙应用以及开发了第一个页面&#xff0c;这只是简单的demo&#xff1b;那么如何去设计&#xff0c;从0到1搭建一个真正的应用呢 一、基本概念 1、Stage模型基本概念 Stage模型概念图 AbilityStage&#xff1a;是一个Module级别的组件容器&#xff0…

Linux---编辑器vim的认识与简单配置

前言 我们在自己的电脑上所用的编译软件&#xff0c;就拿vs2022来说&#xff0c;我们可以在上面写C/C语言、python、甚至java也可以在上面进行编译&#xff0c;这种既可以用来编辑、运行编译&#xff0c;又可以支持很多种语言的编译器是一种集成式开发环境&#xff0c;集众多于…

海外住宅IP介绍

住宅IP&#xff0c;通俗的来讲就是分配给家庭的IP地址&#xff0c;ISP默认分配用户为家庭用户&#xff0c;其真实性与安全性都有一定保障。海外住宅IP是指由海外互联网服务提供商分配给家庭用户的IP地址&#xff0c;IP地址通常是静态的&#xff0c;稳定的&#xff0c;可以为用户…

vue3专栏项目 -- 四、前后端结合(上)

一、前后端分离是什么 前面我们一直在和静态数据打交道&#xff0c;虽然流程可以跑个半通&#xff0c;但是静态数据还是给我们造成了诸多不便&#xff0c;现在我们是时候用上后端了。 现在的应用开发模式&#xff0c;自从SPA出现以后&#xff0c;前端和后端可以平行的进行对应…

【动态规划五】回文串问题

目录 leetcode题目 一、回文子串 二、最长回文子串 三、分割回文串 IV 四、分割回文串 II 五、最长回文子序列 六、让字符串成为回文串的最少插入次数 leetcode题目 一、回文子串 647. 回文子串 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/…

5.15_操作符详解

1、操作符分类&#xff1a; 算术操作符 - * / % 移位操作符 << >> 位操作符 & | ^ 赋值操作符 - ...... 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用、函数调用和结构成员 2、算术操作符 - * / …

将TailwindCSS默认单位rem转换为px

前言&#xff1a; 我这里需要将 默认的rem 转换为 px 原因是要使用 postcss-px-to-viewport 插件做移动端适配。 在tailwind.config.js文件中进行配置&#xff1a; 注意&#xff1a;这里 padding&#xff08;内边距&#xff09;、spacing&#xff08;外边距&#xff09;、width…

Spacy的安装与使用教程

官网安装指导教程 https://spacy.io/usage 安装指令 需要根据自己系统的cuda版本选择 nvcc -V pip install -U pip setuptools wheel pip install -U spacy[cuda12x] python -m spacy download zh_core_web_sm python -m spacy download en_core_web_sm

【Linux】系统登录,调用shell,shell配置文件,shell命令,特殊符号,shell快捷键,Linux运行级别,解决无限登录问题,修改提示符

目录 Linux系统的登录方式 以及 调用shell Linux shell 以及 shell配置文件 shell 命令 shell 特殊符号 shell 快捷键 Linux操作系统运行级别 单用户模式下解决无限登录问题 centos7修改命令行提示符 PS1 补充、centos7没有滚动条 Linux系统的登录方式 以及 调用shell…

vue3.0+antdv的admin管理系统vue-admin-beautiful推荐

前言 几年前&#xff0c;笔者自学了vue这一优秀的前端框架&#xff0c;但苦于没项目练手&#xff0c;无意间发现了vue-admin-beautiful这一优秀的前端集成框架。当时就使用它做了一很有意思的小项目---终端监控云平台&#xff0c;实现了前端和后台的整体功能。整体方案介绍参见…

查询新加 字段不返回数据要看 有没有 AllInfoResultMap 有要再里面加字段

查询新加 字段不返回数据要看 有没有 AllInfoResultMap 有要再里面加字段

HTTP客户端手动解析响应体数据

服务端 package mainimport ("easyGo/person""encoding/json""net/http" )func main() {http.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {p : &person.Person{Name: "jackie",Age: 30,T: pe…

操作系统-单片机进程状态问题(三态模型问题)

例题&#xff1a;在单处理机计算机系统中有1台打印机、1台扫描仪&#xff0c;系统采用先来先服务调度算法。假设系统中有进程P1、P2、P3、P4&#xff0c;其中P1为运行状态&#xff0c;P2为就绪状态&#xff0c;P3等待打印机&#xff0c;P4等待扫描仪。此时&#xff0c;若P1释放…

Java并发编程VarHandle类

Java 的 VarHandle 是在 Java 9 中引入的一种新机制&#xff0c;旨在提供对变量&#xff08;包括对象字段、数组元素和静态变量&#xff09;的可变引用和非阻塞操作。VarHandle 主要用于并发编程&#xff0c;提供了一种更灵活且性能更高的方式来进行变量访问和更新操作&#xf…

es6新语法和ajax和json

es6新语法 1.定义变量&#xff1a;let 2.定义常量&#xff1a;const <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…

用友GRP-U8 userInfoWeb SQL注入致RCE漏洞复现 (XVE-2024-10539)

0x01 产品简介 用友GRP-U8R10行政事业内控管理软件是用友公司专注于国家电子政务事业,基于云计算技术所推出的新一代产品,是我国行政事业财务领域最专业的政府财务管理软件。 0x02 漏洞概述 用友GRP-U8R10行政事业内控管理软件 userInfoWeb接口处存在SQL注入漏洞,未授权的…

ADS使用记录之使用RFPro进行版图联合仿真-加入集总元器件

ADS使用记录之使用RFPro进行版图联合仿真-加入集总元器件 ADS使用记录之使用RFPro进行版图联合仿真中已经简单介绍了使用RFPro对版图就行仿真的方法。但是&#xff0c;如果版图中含有一些非微带的结构&#xff0c;比如说电感、电容、晶体管呢&#xff0c;在此举例解释一下。 …

leetcode61-Rotate List

题目 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2 输出&#xff1a;[4,5,1,2,3] 分析 这道题目用快慢指针即可解&#xff0c;先快指针往前走k个位置&#x…

MyBatis中关于resultType和resultMap的区别

在MyBatis中&#xff0c;resultType和resultMap都是用于处理查询结果的&#xff0c;但它们之间存在一些关键的区别。 映射方式&#xff1a; resultType&#xff1a;直接表示返回类型&#xff0c;它通常对应着Java模型对象&#xff08;如POJO&#xff09;中的实体。当查询出来的…