元类结合__new__

2024-05-15 22:52
文章标签 结合 元类 new

本文主要是介绍元类结合__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

这篇关于元类结合__new__的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/993155

相关文章

java线程深度解析(一)——java new 接口?匿名内部类给你答案

http://blog.csdn.net/daybreak1209/article/details/51305477 一、内部类 1、内部类初识 一般,一个类里主要包含类的方法和属性,但在Java中还提出在类中继续定义类(内部类)的概念。 内部类的定义:类的内部定义类 先来看一个实例 [html]  view plain copy pu

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。

Go 语言中Select与for结合使用break

func test(){i := 0for {select {case <-time.After(time.Second * time.Duration(2)):i++if i == 5{fmt.Println("break now")break }fmt.Println("inside the select: ")}fmt.Println("inside the for: ")}} 执行后

Jenkins--pipeline认识及与RF文件的结合应用

什么是pipeline? Pipeline,就是可运行在Jenkins上的工作流框架,将原本独立运行的单个或多个节点任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。 为什么要使用pipeline? 1.流程可视化显示 2.可自定义流程任务 3.所有步骤代码化实现 如何使用pipeline 首先需要安装pipeline插件: 流水线有声明式和脚本式的流水线语法 流水线结构介绍 Node:

List list = new ArrayList();和ArrayList list=new ArrayList();的区别?

List是一个接口,而ArrayList 是一个类。 ArrayList 继承并实现了List。 List list = new ArrayList();这句创建了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。而ArrayList list=new ArrayList();创建一对象则保留了A

vue原理分析(六)--研究new Vue()

今天我们来分析使用new Vue() 之前研究时,只是说是在创建一个实例。并没有深入进行研究 在vue的源码中找下Vue的构造函数 function Vue(options) {if (!(this instanceof Vue)) {warn$2('Vue is a constructor and should be called with the `new` keyword');}thi

GTK中创建线程函数g_thread_new和g_thread_create的区别

使用GThread函数,需要引用glib.h头文件。 这两个接口的核心区别就是  g_thread_create 是旧的接口,现在已经不使用了,而g_thread_new是新的接口,建议使用。 g_thread_create: g_thread_create has been deprecated since version 2.32 and should not be used in n

New的VC编译器实现

当我们调用 new 的时候,例如 int *p = new int; 时,编译器到底作了什么工作呢?跟进断点看一看。   (在 vc debug模式下 ) double *p1 = new double ; 00411A6E  push        8    00411A70  call        operator new (4111B8h) 00411A75  add

结合Python与GUI实现比赛预测与游戏数据分析

在现代软件开发中,用户界面设计和数据处理紧密结合,以提升用户体验和功能性。本篇博客将基于Python代码和相关数据分析进行讨论,尤其是如何通过PyQt5等图形界面库实现交互式功能。同时,我们将探讨如何通过嵌入式预测模型为用户提供赛果预测服务。 本文的主要内容包括: 基于PyQt5的图形用户界面设计。结合数据进行比赛预测。文件处理和数据分析流程。 1. PyQt5 图形用户界面设计

Python方法:__init__,__new__,__class__的使用详解

转自:https://blog.csdn.net/qq_26442553/article/details/82464682 因为python中所有类默认继承object类。而object类提供了了很多原始的内建属性和方法,所以用户自定义的类在Python中也会继承这些内建属性。可以使用dir()函数可以查看,虽然python提供了很多内建属性但实际开发中常用的不多。而很多系统提供的内建属性实际