当前位置: 首页 > 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…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...

用递归算法解锁「子集」问题 —— LeetCode 78题解析

文章目录 一、题目介绍二、递归思路详解&#xff1a;从决策树开始理解三、解法一&#xff1a;二叉决策树 DFS四、解法二&#xff1a;组合式回溯写法&#xff08;推荐&#xff09;五、解法对比 递归算法是编程中一种非常强大且常见的思想&#xff0c;它能够优雅地解决很多复杂的…...

工厂方法模式和抽象工厂方法模式的battle

1.案例直接上手 在这个案例里面&#xff0c;我们会实现这个普通的工厂方法&#xff0c;并且对比这个普通工厂方法和我们直接创建对象的差别在哪里&#xff0c;为什么需要一个工厂&#xff1a; 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类&#xff1a; 两个发…...