元类的介绍和元类创建类

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

相关文章

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

Python实现html转png的完美方案介绍

《Python实现html转png的完美方案介绍》这篇文章主要为大家详细介绍了如何使用Python实现html转png功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 1.增强稳定性与错误处理建议使用三层异常捕获结构:try: with sync_playwright(

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir