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

python魔术方法(一)

所谓的魔术方法就是让用户客制化类的方法,常常是python中开头有两个下划线的方法。

__new__()

new是创建一个类的过程

class A:def __new__(cls,x):print("__new__")return super().__new__(cls)

由于new函数是建立了一个对象,所以必须返回一个对象

__init__()

init是初始化一个类的过程

class A:def __new__(cls,x):print("__new__")return super().__new__(cls)def __init__(self,x):print("__init__")

这个我们就很常用了

__del__

对象被释放的时候你想做什么,但是吧,python的释放是一个复杂的机制,由解释器控制的,也许这个对象被引用到0的时候被释放了,也有可能被垃圾回收机制释放了,而且这个释放可能在任意地方发生,这个释放是不受控制的,

class A:def __new__(cls,x):print("__new__")return super().__new__(cls)def __init__(self,x):print("__init__")def __del__(self):print("__del__")

这个__del__函数和关键字del没什么关系,del只是让对象少一个引用。

__repr__

返回对象的字符串表示

class A:def __repr__(self):return "A repr"print(repr(A()))

__str__

返回对象的字符串表示,与上面的方法不同的点在于,本方法更多的是返回人类更好理解的信息,上一个方法返回的信息更为详细复杂。

class A:def __repr__(self):return "A repr"
print(str(A()))

如果我们没有定义这个函数,直接去调用呢,也可以,因为python会自动的调用 __repr__的返回值。

__format__

当你尝试用某种格式来打印一个类的时候就会用到这个函数

class A:def __format__(self,spec):if spec == "x":return "0xA"return "A"print("{}".format(15))
print("{:b}".format(15))
print("{:x}".format(15))print("{A()}")
print("{A():x}")

__bytes__

class A:def __bytes__(self):print("__bytes__called")return bytes([0,1])print(bytes(A()))

当你尝试用自己类去建立一个bytes的时候,他应该返回什么,其实除非是客制化一个类的bytes表示,否则也是用不上的。

__eq__

改变比较的逻辑,判断两个对象是否相等

class Date:def __init__(self,num):self.num = numdef __eq__(self,others):return self.num == other.num

为什么不能直接判断呢?,就像下面这样

class Date:def __init__(self,num):self.num = numa = Date(1)
b = Date(1)
print(a == b)

因为如果没定义这些方法的话,a == b就会被翻译为 a is b ,这样的话就是比较两个对象的地址是否相等。咦~~,是不是有点像运算符重载。

而且理论上是不是比较方法必须返回bool值,但是python是没有对这个做任何限制的,你可以返回任何东西。这个有什么用呢,如果你比较两个向量的话,就可以返回一个向量,这个向量表示对应位置的值是否相等。

__ne__

如果我们没有单独的定义不等的魔术方法的话,python会将__eq__的结果取反

class Date:def __init__(self,num):self.num = numdef __ne__(self,others):return self.num != other.num

__gt__

等于或者不等于是有默认实现的,如果我们没有定义的话就会调用 is,但是大于小于就没有默认调用了

class Date:def __init__(self,num):self.num = numdef __gt__(self,others):return self.num > other.num

这里有个有趣的事情

a = Date(2)
b = Date(3)
print(a < b)

返回了结果True,不对啊,这个类没有小于的方法啊,其实这里我们的python又默认了大于和小于是一对,这里就调用了 b.__gt__(a)。因为在语义上a小于b和b大于a是一致的。

__lt__

小于函数,这里的优先级大于上面我们讲的默认大于。

class Date:def __init__(self,num):self.num = numdef __lt__(self,others):return self.num > other.num

但是但是但是!!!这个优先级是一定的嘛?并不是,如果我们比较的不是同一个类的话,那我们就会遇到麻烦,啥?比较的还能不是同一个类??是的,通过继承可以有衍生类啊,如果是和衍生类进行比较的话,优先调用的就父类。大部分情况下就是调用左边的那个类的方法,左边没有就是右边的,如果右边的类是左边的类的子类,那么就优先室友右边的类的函数。

__ge__

大于等于,大体和上面一致,python中不会对大于等于这个运算做任何推测

__le__

小于等于,大体和上面一致,python中不会对大于等于这个运算做任何推测

__hash__

hash散列函数有自己的默认实现,如果我们需要客制化才需要用hash函数。hash的基本定义在于两个类如果相等那么这两个类的hash必然相等。

这个函数要求必须返回一个整数,而且两个对象相等的话他们的hash值必须相等。

class A:def __init__(self,num1,num2):self.num1 = num1self.num2 = num2def __hash__(self):return 2

上面这个方法是可以的,但是很蠢,因为会造成非常严重的哈希碰撞。可以通过把对象的核心属性组成一个tuple的方式,求tuple的hash值作为对象的hash值。

class A:def __init__(self,num1,num2):self.num1 = num1self.num2 = num2def __hash__(self):return hash((self.num1,self.num2))

__bool__

调用对象的bool方法的默认方法。

class A:def __init__(self,num1,num2):self.num1 = num1self.num2 = num2def __bool__(self):if self.num1 > 10:return Truea = A(11)
if a :print("OK")

相关文章:

python魔术方法(一)

所谓的魔术方法就是让用户客制化类的方法&#xff0c;常常是python中开头有两个下划线的方法。 __new__() new是创建一个类的过程 class A:def __new__(cls,x):print("__new__")return super().__new__(cls)由于new函数是建立了一个对象&#xff0c;所以必须返回一…...

IDEA配置部署tomcat详细步骤(maven web 和Javaweb)

目录 读者手册 一、概念与准备工作 &#xff08;一&#xff09;概念 &#xff08;二&#xff09;准备工作 &#xff08;三&#xff09;IDEA配置tomcat服务器&#xff08;maven web项目演示&#xff09; &#xff08; 四&#xff09;Javaweb项目创建tomcat演示 读者手册 读…...

没有设置密码,每次打开RAR文件却都要输密码?

有小伙伴说遇到这种情况&#xff1a;用WinRAR软件压缩RAR文件后&#xff0c;再次打开时显示需要输入密码&#xff0c;但自己压缩文件时并没有设置密码&#xff0c;后续不管几次压缩文件都需要密码&#xff0c;这是怎么回事呢&#xff1f; 其实&#xff0c;这很可能是之前设置压…...

想要知道有哪些免费API接口,看它就够了

免费API它来啦&#xff01; 微信开放平台 https://open.weixin.qq.com/ 让你的应用支持微信登录、微信分享、微信支付等功能。 百度地图开放平台 https://lbsyun.baidu.com/index.php?titlewebapi 百度地图Web服务API为开发者提供http/https接口&#xff0c;即开发者通过…...

【Java】二叉树

一、树形结构 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。它具有以下的特点&#xff1a; 有一个特殊…...

C++学习记录——구 模板初阶

文章目录1、泛型编程和函数模板1、函数模板的实例化2、模板参数的匹配原则2、类模板1、泛型编程和函数模板 泛型编程顾名思义&#xff0c;泛用性很高。之前C可以用重载来对付同名函数&#xff0c;但还是麻烦&#xff0c;有一个类型的变量就得写一个类型的函数。C对此创建了库这…...

筑基五层 —— 位运算看这篇就行了

目录 一.修炼必备 二. 位运算 二.移位运算符 三.位运算综合使用 恭喜你&#xff0c;成功突破至筑基五层&#xff01;&#xff01;&#xff01; 一.修炼必备 1.入门必备&#xff1a;VS2019社区版&#xff0c;下载地址&#xff1a;Visual Studio 较旧的下载 - 2019、2017、201…...

windows安装proget实现nuget私有包部署

下载proget 官网 下载地址 免费下载 安装proget 下载完成之后双击安装 选择ProGet 默认选择即可 也可以指定数据库&#xff0c;SQL Server数据库 Server服务器名;Database数据库名;User Id用户名;Password密码 Serverlocalhost;DatabaseProGet2;User Idsa;Passwordxxxx…...

SpringBoot简单集成OpenFeign

问题 在SpringBoot中简单集成Feign&#xff0c;不想使用Rest Temple了。 步骤 Maven <properties><spring.cloud-version>2022.0.1</spring.cloud-version></properties> <dependencyManagement><dependencies><dependency><g…...

dfs(九)字符串的全排列

字符串的排列_牛客题霸_牛客网【牛客题霸】收集各企业高频校招笔面试题目&#xff0c;配有官方题解&#xff0c;在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力https://www.nowcoder.com/practice/fe6b651b66ae47d7ac…...

别具一格,原创唯美浪漫情人节表白专辑,(复制就可用)(html5,css3,svg)表白爱心代码(1)

别具一格&#xff0c;原创唯美浪漫情人节表白专辑&#xff0c; (复制就可用)&#xff08;html5,css3,svg)表白爱心代码(1) 一、 前言 回眸之间&#xff0c;丰盈了岁月&#xff0c;涟漪了思绪&#xff0c;轻轻落笔&#xff0c;不写伤痕&#xff0c;不写仇怨&#xff0c;只写岁月…...

Hudi-集成Spark之spark-sql方式

Hudi集成Spark之spark-sql方式 启动spark-sql # 启动spark-sql之前需要先启动Hive的Metastore nohup hive --service metastore & #针对Spark 3.2 spark-sql \--conf spark.serializerorg.apache.spark.serializer.KryoSerializer \--conf spark.sql.catalog.spark_catal…...

快速排序基本原理

快速排序基本原理1.快速排序1.1 基本原理1.2 快速排序执行步骤1.2.1 分区包含步骤1.2.1 分区步骤1.3 快速排序大O记法表示2. 将[0,5,2,1,6,3]进行快速排序 【实战】2.1 第一次分区步骤2.2 第二次分区步骤2.3 第三次分区步骤2.4 第四次分区步骤3.快速排序代码实现1.快速排序 1.…...

Android开发笔记-提纲(连载中....)

文章目录Android概述Android开发学习笔记提纲1. 认识AS开发Android的基础入门知识2. 认识Activity的生命周期和基础使用3. 认识Activity之间的跳转和传值4. 认识Intent以及全局Activity的属性的共享5. 认识Service6. 学习跨应用服务【AIDL通信】Android概述 Android系统框架的四…...

React Native(一)

移动端触摸事件example1:<ButtononPress{() > {Alert.alert(你点击了按钮&#xff01;);}}title"点我&#xff01;" />Touchable 系列组件TouchableHighlight 此组件的背景会在用户手指按下时变暗TouchableNativeFeedback 会在用户手指按下时形成类似墨水涟…...

Kotlin 26. Kotlin 如何播放音频文件

Kotlin 如何播放音频文件 文章目录Kotlin 如何播放音频文件1 下载并放置音频文件2 activity_main.xml3 MainActivity.kt1 下载并放置音频文件 我们可以随便下载一个音频文件&#xff0c;比如 alarm.mp3&#xff0c;需要将其放置在 /res/raw/ 路径下。 2 activity_main.xml 这…...

recv和明文收包分析

我们CTRLg 跳到recv 分析收包函数 发现函数会断并且收包函数返回值(收包包长)也会不断变化 那么证明recv是真正的收包函数&#xff0c;游戏没有重新实现该函数 我们只要分析该函数即可 在recv函数执行完毕以后下断 eax是包长,esi28是包指针 我们上2个号&#xff0c;让另外…...

【IVIF的超分重建】

Multimodal super-resolution reconstruction of infrared and visible images via deep learning &#xff08;基于深度学习的红外和可见光图像多模态超分辨率重建&#xff09; 提出了一种基于编解码器结构的红外-可见光图像融合方法。图像融合任务被重新表述为保持红外-可见…...

“深度学习”学习日记。--加深网络

2023.2.13 深度学习 是加深了层的深度神经网络的学习过程。基于之前介绍的网络&#xff0c;只需要通过 叠加层&#xff0c; 就可以创建深度网络 之前的学习&#xff0c;已经学习到了很多东西&#xff0c;比如构成神经网络的各种层、参数优化方法、误差反向传播法&#xff0c;…...

2023前端面试总结含参考答案

文章目录1. 父子组件生命周期的执行顺序:2. 原型链&#xff1a;3. promise的理解&#xff1a;4. 数组循环&#xff0c;foreach&#xff0c;filter&#xff0c;map&#xff0c;reduce5. 数组去重&#xff0c;set6. 组件通信方式7. 路由钩子8. 首页首屏加载优化&#xff1a;9. th…...

ThreeJS纹理优化:如何正确设置magFilter和minFilter避免贴图闪烁

ThreeJS纹理优化实战&#xff1a;magFilter与minFilter的深度解析与性能平衡 在ThreeJS开发中&#xff0c;纹理质量直接影响着3D场景的最终呈现效果。许多开发者都遇到过这样的困扰&#xff1a;当镜头拉远时&#xff0c;原本精致的贴图突然出现闪烁、摩尔纹或模糊不清的问题。这…...

即插即用系列 | CVPR 2026 | GSRA:自注意力创新!几何校正空间一致性,语义强化高层关联,特征更精准! | 代码分享

0. 前言 本文介绍了GSRA&#xff08;Geometric-Semantic Rectification Attention&#xff0c;几何-语义校正注意力&#xff09;&#xff0c;其通过跨模态差分注意力机制&#xff0c;首次在图像阴影去除领域实现对几何特征与语义特征的精准对齐&#xff0c;有效破解了传统方法…...

Android滚动选择器架构深度解析:WheelPicker的技术实现与设计哲学

Android滚动选择器架构深度解析&#xff1a;WheelPicker的技术实现与设计哲学 【免费下载链接】WheelPicker Simple and fantastic wheel view in realistic effect for android. 项目地址: https://gitcode.com/gh_mirrors/wh/WheelPicker 在移动应用交互设计中&#x…...

Pixel Dimension Fissioner实战教程:结合LangChain构建带记忆的像素裂变Agent

Pixel Dimension Fissioner实战教程&#xff1a;结合LangChain构建带记忆的像素裂变Agent 1. 工具介绍与核心能力 Pixel Dimension Fissioner是一款基于MT5-Zero-Shot-Augment核心引擎构建的文本增强工具&#xff0c;它将传统AI工具的文本处理能力与16-bit像素冒险游戏的视觉…...

【LaTeX PPT设计指南】Beamer主题与配色的高效搭配技巧

1. Beamer主题与配色的基础认知 第一次用LaTeX做PPT时&#xff0c;我被Beamer的主题系统惊艳到了——原来学术汇报也能这么优雅。与PowerPoint手动调整每个元素的繁琐不同&#xff0c;Beamer通过\usetheme和\usecolortheme两条命令就能实现整体视觉风格的切换。这里有个实用技…...

三分算法的简单应用

三分算法的简单应用三分算法三分算法求函数极值P1883 Error Curves - 洛谷P5931 灯泡 - 洛谷P2571 传送带 - 洛谷OJ参考三分算法 二分法在单调函数上查找特定值或在有序数组中搜索目标&#xff0c;依赖于函数在区间内具有单调性&#xff0c;从而能够通过一次比较确定目标所在的…...

Phi-3-vision-128k-instruct部署指南:Ubuntu系统下的Docker容器化实战

Phi-3-vision-128k-instruct部署指南&#xff1a;Ubuntu系统下的Docker容器化实战 1. 引言 如果你正在寻找一个能在Ubuntu系统上快速部署Phi-3-vision-128k-instruct模型的解决方案&#xff0c;那么这篇指南就是为你准备的。我们将使用Docker容器化技术&#xff0c;让你在15分…...

5分钟搞定Flux2 Klein:ComfyUI工作流详解,动漫转写实超简单

5分钟搞定Flux2 Klein&#xff1a;ComfyUI工作流详解&#xff0c;动漫转写实超简单 1. 为什么你需要这个工具 如果你经常需要将动漫风格的图片转换成写实风格&#xff0c;但苦于Photoshop修图耗时耗力&#xff0c;那么Flux2 Klein就是你的救星。这个基于ComfyUI的工作流&…...

收藏备用|2026大模型学习全攻略(小白+程序员专属,从入门到精通无坑路线)

本文专为CSDN平台零基础小白、在岗程序员量身打造&#xff0c;核心分享“从实践到理论再到复盘实践”的科学大模型学习体系&#xff0c;覆盖Prompt工程、AI编程提效、API调用落地、RAG检索增强、Agent智能代理开发全流程&#xff0c;详解模型微调核心技术&#xff0c;同步附上2…...

ADE7880电能计量库深度解析与嵌入式校准实践

1. ADE7880 Energy计量库技术解析与工程实践指南ADE7880 Energy库是一款面向嵌入式平台&#xff08;特别是Arduino IDE生态&#xff09;的专用驱动库&#xff0c;用于控制Analog Devices公司推出的高精度多相电能计量芯片ADE7880。该芯片集成三相电压/电流通道、24位Σ-Δ ADC、…...