首页 > 编程语言 >python - metaclass

python - metaclass

时间:2022-11-24 14:55:41浏览次数:43  
标签:__ ... python args Student kwargs LittleMeta metaclass


 

metaclass 的作用

- 在python 的世界, 一起都是object. 类也是object。 上面这张图很好的描述了class 类的创建过程。 通过下面的例子来了解类的创建过程, 实例对象的创建过程。

通过这个过程, 可以了解metaclass 的作用。

 1 import re
 2 
 3 
 4 class LittleMeta(type):
 5     def __new__(cls, clsname, superclasses, attributedict):
 6         if re.match("[a-z]", clsname[0]):
 7             raise Exception
 8         print(f"LittleMeta __new__ - attributedict {attributedict}。。。")
 9         return type.__new__(cls, clsname, superclasses, attributedict)
10 
11     def __init__(self, *args, **kwargs):
12         print(f"LittleMeta __init__ *args - {args}... **kwargs - {kwargs}...")
13         pass
14 
15     def __call__(self, *args, **kwargs):
16         print("LittleMeta __call__  *args - {args}... **kwargs - {kwargs}...")
17         super(LittleMeta, self).__call__(*args, **kwargs)
18 
19 
20 class Student(metaclass=LittleMeta):
21     cls_name = "jiangnan"
22     def __init__(self, name, age):
23         self.name = name
24         self.age = age
25 
26 
27 
28 print("start assign a instance for Student class")
29 s1 = Student("allen", 15)
30 print("done")
View Code

 

 

代码执行结果如下:

LittleMeta __new__ - attributedict {'__module__': '__main__', '__qualname__': 'Student', 'cls_name': 'jiangnan', '__init__': <function Student.__init__ at 0x000001FC22235A20>}。。。
LittleMeta __init__ *args - ('Student', (), {'__module__': '__main__', '__qualname__': 'Student', 'cls_name': 'jiangnan', '__init__': <function Student.__init__ at 0x000001FC22235A20>})... **kwargs - {}...
start assign a instance for Student class
LittleMeta __call__  *args - {args}... **kwargs - {kwargs}...
done

分析:

1. 在创建Student class 的过程中, 即 line 20 class Student, python 其实是实例化metaclass, 调用的metaclass 的 __new__(), __init__()

2. 在执行 s1 = Student("allen", 15) 时, 其实是调用metaclass 的__call__().

标签:__,...,python,args,Student,kwargs,LittleMeta,metaclass
From: https://www.cnblogs.com/hello-pyworld/p/16921754.html

相关文章

  • Python第九周
    一.   实验目的和要求了解Pyhon中常见的异常二.  实验环境 python3.1064-bit三.  实验过程实例1代码如下:1print("\n",'='*10,"蚂蚁庄园动态","="*10)2......
  • python第一章三引号的用法
    #用2种方式拼接信息,第一种为常用方式name=input("name:")age=input("age:")job=input("job:")salary=input("salary:")info1='''--------------------info1of{_......
  • python进阶(29)单例模式
    初识单例模式 单例模式含义单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个......
  • 【python算法】24点
    defsolution(numbers):res=set()defpoint24(numbers):iflen(numbers)==1:ifabs(eval(numbers[0])-24)<1e-10:......
  • Python Charles抓包配置实现流程图解
    配置大佬的博客真的很详细很详细,我就不重复造轮子了,看这里补充解释在这一步疑问很多,大佬说的不是很详细,就由我来补充下吧~在PC端Charles这样点击:之后会这样提示:我们......
  • 网易Python后台开发面经
    社招。总共3轮技术面+1轮HR面,难度中等。问的问题基本都比较务实,纯技术和八股,没有算法。一面(40min)这一面比较水,主要是摸底。自我介绍。简历项目和个人工作介绍。djang......
  • Python 快速入门
    目录Python快速入门1环境配置1.1简介1.2Python安装1.3其余软件1.4编辑器的使用2基础语法2.1特点2.2代码块2.3注释3数据类型3.1变量类型3.2数据结构3.3运算......
  • 【GUI开发案例】用python爬百度搜索结果,并开发成exe桌面软件!
    一、背景介绍你好,我是@马哥python说,一名10年程序猿。1.1老版本之前我开发过一个百度搜索的python爬虫代码,具体如下:【python爬虫案例】用python爬取百度的搜索结果!......
  • python3_字符串操作
    Python字符串|菜鸟教程(runoob.com)Python字符串方法(w3school.com.cn)1、记录内置函数用法:ifFullVersion.endswith('NIO')#如果字符串以指定值结尾,则endswith......
  • 力扣81(java&python)-搜索旋转排序数组 II(中等)
    题目:已知存在一个按非降序排列的整数数组nums,数组中的值不必互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[......