Python之类方法、__new__方法和__init__方法介绍

在编程语言中创建一个类,有构造方法这样的一个术语。而在Python中,通常大家都认为__init__是构造方法,其实并不完全等同。在构建类中,有一个特殊的方法__new__,这个才能等同为构造方法。

__new__是一个类方法,我们在定义一个类方法时需要在函数前打上@classmethod装饰器,而__new__不需要,因为它经过特殊处理。为了理解__new__方法,我们先来看看类方法是什么。

类方法

class MyClass:@classmethoddef test(cls):print(cls.__name__)MyClass.test()
#输出 MyClass

在MyClass类中,test方法就是类方法,它传入第一个参数为cls,其实就是MyClass类,打印cls.__name__可以看到结果。类方法可以直接 类名.方法名()调用。通常类方法是备选构造方法。

类方法的应用

>>> from datetime import datetime
>>> datetime.fromtimestamp(324234)
datetime.datetime(1970, 1, 5, 2, 3, 54)

如上所示,内置的datetime包中的fromtimestamp就是类方法,可以从多种方式构造出datetime对象。

__new__方法

def __new__(cls, a):return super().__new__(cls)

__new__是类方法,所以第一个参数也是cls,剩下的参数就是构造方法里需要的参数了。通常__new__都不需要定义,在元类编程中才需要,它可以控制类的生成过程。

__new__必须返回一个实例(instance),传入到__init__方法中的self参数,也就是实例变量。这里返回父类(object)的__new__方法用来创建一个新的实例。相当于

obj = object.__new__(MyClass)
obj = MyClass()
#obj是实例,上面两个方式等同

其中,MyClass是类,obj是实例(instance)

__init__方法

__new__是构造方法,那么__init__就是初始化函数,它负责将变量绑定到实例中,更新实例的__dict__字典。其中第一个参数self就是__new__的返回值,是类的实例。__new__方法先于__init__方法执行。

def __init__(self, a):self.a = a

结合使用

class MyClass:def __new__(cls, a):return super().__new__(cls)def __init__(self, a):self.a = a
obj = MyClass(3)
print(obj.a)

要点

1.__new__是构造方法,__init__是初始化函数。

2.__new__通常不需要手动定义,一般在元类编程中使用,控制类的生成过程。

3.__new__第一个被执行,然后执行__init__绑定实例变量。

4.__new__必须有返回值,返回值是该类的实例,它会被__init__函数接收,通常叫做self变量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2662330.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

UniApp微信小程序使用echarts图标教程(附源码)

在项目中直接使用echarts时,H5端是OK的,但微信小程序会报错,所以来看一下如何在微信小程序中使用echarts 1.打开链接,下载第一个 下载链接 注意看 此时这个版本是5.3.3 2.官网在线定制,下载下来 注意与版本 等待下载…

10、RabbitMQ高频面试题

1、你们项目中哪里用到了RabbitMQ RabbitMQ是我们项目中服务通信的主要方式之一 , 我们项目中服务通信主要有二种方式实现 : 通过Feign实现服务的同步调用通过MQ实现服务的异步通信 下面要结合自己的项目中功能来说两个地方 xxx xxx 2、为什么会选择使用RabbitMQ 我们项…

k8s搭建(四、k8s集群创建)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

一篇文章掌握 NestJS 所有的生命周期以及生命周期的执行时机

前言 NestJS 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的框架,它使用 TypeScript 作为开发语言,也支持原生的 JavaScript。在 NestJS 中,生命周期事件是一个重要的概念。在我们构建和管理应用程序时,有时需要在特定…

Fiori Launchpad Error Unable to load groups

进入launchpad 报错如上 输入事务代码 /IWFND/ERROR_LOG 查看错误日志 输入事务代码:/N/IWFND/MAINT_SERVICE 设置filter 如下 选中服务点击添加系统别名--》 点击 新条目 输入如下: 我这个问题还有一个报错处理方法相同 完成上述操作之后&#xf…

Typora使用PicGo+Gitee上传图片报错403 Forbidden

Typora使用PicGoGitee上传图片报错403 Forbidden Typora使用PicGoGitee上传图片,上传失败了,错误信息如下 打开PicGo的日志文件查看,可以看到错误详情如下 换了一个插件github-plus重新配置,解决了这个问题 再打开日志查看&…

Git 浅入浅出

前提 最近和同事分模块联合开发代码,自然而然就要用到 Git 管理代码;借此机会,对 Git 进行简单介绍。 Git 的特征 文件系统 我们都知道 Git 是个版本控制系统,但是如果你深入了解其原理,就不难发现它更像一个文件管…

快速解决找不到msvcp120.dll的五个方法,dll文件修复方法

本文将详细介绍msvcr120.dll文件的相关知识,并提供五种解决msvcr120.dll缺失的方法。 一、msvcr120.dll是什么文件和msvcr120.dll的作用是什么介绍 msvcr120.dll是Microsoft Visual C Redistributable Package的一部分,它是运行许多基于Windows操作系统…

【js自定义鼠标样式】【js自定义鼠标动画】

文章目录 前言一、效果图二、实现步骤1. 去除原有鼠标样式2. 自定义鼠标样式3. 使用 总结 前言 自定义鼠标形状,自定义鼠标的动画,可以让我们的页面更加有设计感。 当前需求:吧鼠标自定义成一个正方形,鼠标的效果有:和…

sysbench

一、sysbench介绍 1、sysbench简介 sysBench是一个模块化的、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况。sysbench提供如下测试: (1)CPU性能 (2)磁盘IO性能 &…

SourceTree的安装和使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、安装:二、使用步骤1.获取地址2.放入sourceTree 3.点击推送 前言 提示:这里可以添加本文要记录的大概内容: 简单讲解一…

Vue - 实现文件导出文件保存下载

1 文件导出:使用XLSX插件 需求背景:纯前端导出,如 在前端页面勾选部分表格数据,点击"导出"按钮导出Excel文件。 实现思路: 1.通过XLSX插件的 XLSX.utils.book_new()方法,创建excel工作蒲对象wb…

既然前端工程师可以进腾讯字节阿里等大厂,为什么要高薪进小公司?

前言 前不久后台有一个粉丝给我留言:为什么很多人参加校招的时候,宁愿低薪也要进大厂,而不选择更高薪的小公司呢? (文末有惊喜!文末有惊喜!) 我想了一下,大概是有3个原因…

6130 树的最长路

思路:树的最长路问题可以通过两次 DFS 求解,具体思路如下: 1.第一次 DFS 求树的直径 以任意一个点为起点进行深度优先遍历(DFS),找到与该点距离最远的点 u 。 以 u 为起点进行 DFS ,找到与 u 距…

win10系统gpu本地部署chatglm3-6b,从0开始安装

开源地址: GitHub - THUDM/ChatGLM3: ChatGLM3 series: Open Bilingual Chat LLMs | 开源双语对话语言模型 前言:ChatGLM2与ChatGLM3区别 ChatGLM2与ChatGLM3模型架构是完全一致的,ChatGLM与后继者结构不同。可见ChatGLM3相对于ChatGLM2没…

LabVIEW在电机噪声与振动探测的应用

LabVIEW在电机噪声与振动探测的应用 硬件部分是电机噪声和振动测试分析系统的基础,主要由三大核心组件构成:高灵敏度振动传感器、先进的信号调理电路和高性能数据采集卡。这些设备协同工作,确保了从电机捕获的噪声和振动信号的准确性和可靠性…

盲盒电商:重塑消费者行为与市场格局

一、什么是盲盒电商? 盲盒电商是一种新型的电子商务模式,它通过将商品隐藏在盲盒中,让消费者在购买时无法知道具体商品,只能通过猜测和期待来体验购物的乐趣。这种模式在年轻人中非常受欢迎,因为它提供了一种全新的购…

labuladong日常刷题-递归魔法 | LeetCode 206反转链表 92反转链表-ii

递归魔法 LeetCode 206 反转链表 2023.12.26 题目链接labuladong讲解[链接] ListNode* reverseList(ListNode* head) {//递归退出条件if(head NULL || head->next NULL)return head;//递归ListNode* last reverseList(head->next);//处理head->next->next …

电脑msvcr120.dll丢失怎样修复,一分钟教会你修复方法

在计算机使用过程中,我们可能会遇到各种问题,其中之一就是“msvcr120.dll丢失”的错误提示。这个错误通常发生在运行某些程序时,由于系统缺少了msvcr120.dll文件,导致程序无法正常运行。那么,什么是msvcr120.dll文件呢…

深入浅出理解转置卷积Conv2DTranspose

温故而知新,可以为师矣! 一、参考资料 论文:A guide to convolution arithmetic for deep learning github源码:Convolution arithmetic bilibili视频:转置卷积(transposed convolution) 转置…