元类的介绍和元类创建类

2024-05-16 01:12
文章标签 介绍 创建 元类

本文主要是介绍元类的介绍和元类创建类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【一】什么是元类

元类是所有类的基类,包括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.chinasem.cn/article/993446

相关文章

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

Maven创建项目中的groupId, artifactId, 和 version的意思

文章目录 groupIdartifactIdversionname groupId 定义:groupId 是 Maven 项目坐标的第一个部分,它通常表示项目的组织或公司的域名反转写法。例如,如果你为公司 example.com 开发软件,groupId 可能是 com.example。作用:groupId 被用来组织和分组相关的 Maven artifacts,这样可以避免