当前位置: 首页 > news >正文

元类结合__new__

  • __new__:用来生成骨架

  • __init__:骨架添加血肉

【一】类中的__new__

class MyClass(object):def __init__(self,name,age):print(f"给当前MyClass类的对象初始化属性的时候会触发__init__")self.name = nameself.age = age
​def __call__(self,*args,**kwargs):print(f"当前 MyClass 类的对象被调用的时候会触发 __call__")return f'当前 MyClass 类 的 __call__ 的返回值 :>>>> {self.name}'
​# 【三】画骨架,有骨架才能上色def __new__(cls, *args, **kwargs):print(f"给当前 MyClass 类的对象创建骨架的时候会触发 __new__")# 当前类本身print(f" MyClass 类 的 __call__ 的 cls :>>>> {cls}")# <class '__main__.MyClass'>
​# 当前类初始化传的位置参数print(f" MyClass 类 的 __call__ 的 args :>>>> {args}")# ('knight',)
​# 当前类初始化传的关键字参数print(f" MyClass 类 的 __call__ 的 args :>>>> {kwargs}")# {'age': 18}
​# 【四】调用父类的object的new帮我搭骨架,将当前生成的骨架返回obj = object.__new__(cls)# 查看当前返回值发现是一个对象;类型print(f"obj:{obj}")     # <__main__.MyClass object at 0x0000024E61B16830># 查看名称空间,发现是空的print(f"obj.__dict__:{obj.__dict__}")       # {}# 【五】调用自己的__init__方法 初始化属性obj.__init__(*args, **kwargs)# 【六】给自己的名称空间初始化属性print(f"obj.__dict__:{obj.__dict__}")       # {'name': 'knight', 'age': 18}# 返回生成的骨架return obj
​
​
# MyClass 相当于给你一张纸
# 【一】类() 调用 ---> 一定会触发 __init__ 初始化对象的属性 #  __init__  给你人体骨架上个色
# 【二】在调用  __init__  之前要调用 __new__  # __new__ 相当于将你人体的骨架搭建好
m = MyClass('knight',age=18)
​
print(m.name)      # knight

【二】元类中的__new__

class MyType(type):def __init__(cls,class_name,class_bases,class_name_space):super().__init__(class_name,class_bases,class_name_space)
​def __call__(self, *args, **kwargs):# 得到一个空的对象obj = super().__call__(*args,**kwargs)return obj
​# # 【三】画骨架,有骨架才能上色def __new__(cls, *args, **kwargs):print(f"给当前 MyType 类的对象创建骨架的时候会触发 __new__")# 给当前 MyType 类的对象创建骨架的时候会触发 __new__
​# 当前类本身print(f" MyType 类 的 __call__ 的 cls :>>>> {cls}")# <class '__main__.MyType'>
​# 当前类初始化传的位置参数print(f" MyType 类 的 __call__ 的 args :>>>> {args}")# ('knight',)
​# 当前类初始化传的关键字参数print(f" MyType 类 的 __call__ 的 args :>>>> {kwargs}")# {'age': 18}
​# 【四】寻求父类来帮助搭建骨架obj = type.__new__(cls, *args, **kwargs)print(f"obj:{obj}")     # <class '__main__.MyClass'>print(f"obj.__dict__:{obj.__dict__}")# obj.__dict__:{'__module__': '__main__', '__init__': <function MyClass.__init__ at 0x000001A0B7C32170>, '__call__': <function MyClass.__call__ at 0x000001A0B7C32200>, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>, '__doc__': None}return obj
​
​
​
​
class MyClass(metaclass=MyType):def __init__(self,name,age):print(f"给当前MyClass类的对象初始化属性的时候会触发__init__")self.name = nameself.age = age
​def __call__(self,*args,**kwargs):print(f"当前 MyClass 类的对象被调用的时候会触发 __call__")return f'当前 MyClass 类 的 __call__ 的返回值 :>>>> {self.name}'
​
​
m = MyClass('knight',age=18)
​
print(m.name)      # knight
http://www.lryc.cn/news/349991.html

相关文章:

  • (C语言)队列实现与用队列实现栈
  • 字符画生成网站 ascii字符画
  • 【C -> Cpp】由C迈向Cpp (6):静态、友元和内部类
  • 探索Playwright:Python下的Web自动化测试革命
  • 先有JVM还是先有垃圾回收器?很多人弄混淆了
  • 关于 vs2019 c++20 规范里的一个全局函数 _Test_callable
  • 07-Fortran基础--Fortran指针(Pointer)的使用
  • 日期差值,
  • GMV ES6直流变频多联空调机组室外机工作原理
  • 中国开源 AI 大模型之光-InternLM2
  • 【嵌入式开发】Arduino人机界面及接口技术:独立按键接口,矩阵按键接口,模拟量按键接口(基础知识介绍)
  • element ui Tree树形控件
  • AI 绘画神器 Fooocus 图生图:图像放大或变化、图像提示、图像重绘或扩充、反推提示词、生成参数提取、所需模型下载
  • yolov8 模型架构轻量化 | 极致降参数量
  • uniapp 小程序低功耗蓝牙配网 ble配网 物联网
  • 服务器防火墙有什么用防护策略
  • 27.哀家要长脑子了!
  • Redis实战—验证码登录注册
  • 对话机器人技术解说
  • 红黑树底层封装map、set C++
  • 压力给到 Google,OpenAI 发布 GPT-4o 来了
  • 【SpringSecurity源码】过滤器链加载流程
  • 第9章.Keil5-MDK软件简介
  • mysql中utf8字符集中文字节长度统计如何统计到2个字节一个汉字
  • 如何实现Linux双网卡同时连接内网和外网的配置?
  • ASCLL码表以及字符的相加减
  • 一键修复所有dll缺失,教大家解决丢失的dll文件
  • wsl2安装rancher并导入和创建k8s集群
  • 内网环境ubuntu设置静态ip、DNS、路由,不影响网络访问
  • 学习前端第三十七天(静态属性静态方法、类检查、错误处理)