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魔术方法(一)
所谓的魔术方法就是让用户客制化类的方法,常常是python中开头有两个下划线的方法。 __new__() new是创建一个类的过程 class A:def __new__(cls,x):print("__new__")return super().__new__(cls)由于new函数是建立了一个对象,所以必须返回一…...
IDEA配置部署tomcat详细步骤(maven web 和Javaweb)
目录 读者手册 一、概念与准备工作 (一)概念 (二)准备工作 (三)IDEA配置tomcat服务器(maven web项目演示) ( 四)Javaweb项目创建tomcat演示 读者手册 读…...
没有设置密码,每次打开RAR文件却都要输密码?
有小伙伴说遇到这种情况:用WinRAR软件压缩RAR文件后,再次打开时显示需要输入密码,但自己压缩文件时并没有设置密码,后续不管几次压缩文件都需要密码,这是怎么回事呢? 其实,这很可能是之前设置压…...
想要知道有哪些免费API接口,看它就够了
免费API它来啦! 微信开放平台 https://open.weixin.qq.com/ 让你的应用支持微信登录、微信分享、微信支付等功能。 百度地图开放平台 https://lbsyun.baidu.com/index.php?titlewebapi 百度地图Web服务API为开发者提供http/https接口,即开发者通过…...
【Java】二叉树
一、树形结构 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 有一个特殊…...
C++学习记录——구 模板初阶
文章目录1、泛型编程和函数模板1、函数模板的实例化2、模板参数的匹配原则2、类模板1、泛型编程和函数模板 泛型编程顾名思义,泛用性很高。之前C可以用重载来对付同名函数,但还是麻烦,有一个类型的变量就得写一个类型的函数。C对此创建了库这…...
筑基五层 —— 位运算看这篇就行了
目录 一.修炼必备 二. 位运算 二.移位运算符 三.位运算综合使用 恭喜你,成功突破至筑基五层!!! 一.修炼必备 1.入门必备:VS2019社区版,下载地址:Visual Studio 较旧的下载 - 2019、2017、201…...
windows安装proget实现nuget私有包部署
下载proget 官网 下载地址 免费下载 安装proget 下载完成之后双击安装 选择ProGet 默认选择即可 也可以指定数据库,SQL Server数据库 Server服务器名;Database数据库名;User Id用户名;Password密码 Serverlocalhost;DatabaseProGet2;User Idsa;Passwordxxxx…...
SpringBoot简单集成OpenFeign
问题 在SpringBoot中简单集成Feign,不想使用Rest Temple了。 步骤 Maven <properties><spring.cloud-version>2022.0.1</spring.cloud-version></properties> <dependencyManagement><dependencies><dependency><g…...
dfs(九)字符串的全排列
字符串的排列_牛客题霸_牛客网【牛客题霸】收集各企业高频校招笔面试题目,配有官方题解,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力https://www.nowcoder.com/practice/fe6b651b66ae47d7ac…...
别具一格,原创唯美浪漫情人节表白专辑,(复制就可用)(html5,css3,svg)表白爱心代码(1)
别具一格,原创唯美浪漫情人节表白专辑, (复制就可用)(html5,css3,svg)表白爱心代码(1) 一、 前言 回眸之间,丰盈了岁月,涟漪了思绪,轻轻落笔,不写伤痕,不写仇怨,只写岁月…...
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(你点击了按钮!);}}title"点我!" />Touchable 系列组件TouchableHighlight 此组件的背景会在用户手指按下时变暗TouchableNativeFeedback 会在用户手指按下时形成类似墨水涟…...
Kotlin 26. Kotlin 如何播放音频文件
Kotlin 如何播放音频文件 文章目录Kotlin 如何播放音频文件1 下载并放置音频文件2 activity_main.xml3 MainActivity.kt1 下载并放置音频文件 我们可以随便下载一个音频文件,比如 alarm.mp3,需要将其放置在 /res/raw/ 路径下。 2 activity_main.xml 这…...
recv和明文收包分析
我们CTRLg 跳到recv 分析收包函数 发现函数会断并且收包函数返回值(收包包长)也会不断变化 那么证明recv是真正的收包函数,游戏没有重新实现该函数 我们只要分析该函数即可 在recv函数执行完毕以后下断 eax是包长,esi28是包指针 我们上2个号,让另外…...
【IVIF的超分重建】
Multimodal super-resolution reconstruction of infrared and visible images via deep learning (基于深度学习的红外和可见光图像多模态超分辨率重建) 提出了一种基于编解码器结构的红外-可见光图像融合方法。图像融合任务被重新表述为保持红外-可见…...
“深度学习”学习日记。--加深网络
2023.2.13 深度学习 是加深了层的深度神经网络的学习过程。基于之前介绍的网络,只需要通过 叠加层, 就可以创建深度网络 之前的学习,已经学习到了很多东西,比如构成神经网络的各种层、参数优化方法、误差反向传播法,…...
2023前端面试总结含参考答案
文章目录1. 父子组件生命周期的执行顺序:2. 原型链:3. promise的理解:4. 数组循环,foreach,filter,map,reduce5. 数组去重,set6. 组件通信方式7. 路由钩子8. 首页首屏加载优化:9. th…...
总览 Java 容器--集合框架的体系结构
前言 我们在讲 Java 的数据类型的时候,单独介绍过数组,数组也确实是开发程序中常用的内存类型之一,不过 Java 内置的数组限制颇多,所以此后扩展出了List这种结构,与之类似的Set、Queue 这些内存中的容器都被放在了 Co…...
即便考分很好也不予录取的研究生复试红线,都是原则性问题
在浙大研究生招生录取政策文件中有这么一句话:坚持“按需招生、全面衡量、择优录取、宁缺毋滥”的原则,以提高人才选拔质量为核心,在确保安全性、公平性和科学性的基础上,做到统筹兼顾、精准施策、严格管理。字字体现出研究生招生…...
Android java创建子线程的几种方法
1.新建一个类继承自Thread,并重写run()方法,并在里面编写耗时逻辑。 1 2 3 4 5 6 7 class ThreadTest extends Thread { Override public void run() { //具体的耗时逻辑代码 } } new ThreadTest().st…...
UVa 11212 Editing a Book 编辑书稿 IDA* Iterative Deepening A Star 迭代加深搜剪枝
题目链接:Editing a Book 题目描述: 给定nnn个(1<n<10)1<n<10)1<n<10)数字,数字分别是1,2,3,...,n1, 2, 3, ...,n1,2,3,...,n,但是顺序是打乱的,你可以选择一个索引区间的数字进行剪切操作。问最少进…...
第一章:unity性能优化之内存优化
目录 前言 unity性能优化之内存的优化 一、unity Analysis工具的使用。 二、内存优化方法 1、设置和压缩图片 2、图片格式 3、动画文件 4、模型 5、RenderTexture(RT) 6、分辨率 7、资源的重复利用 8、shader优化 9、对bundle进行良好的管…...
2023年家族办公室研究报告
第一章 概况 家族办公室最早起源于古罗马时期的大“Domus”(家族主管)以及中世纪时期的大“Domo”(总管家)。现代意义上的家族办公室出现于19世纪中叶,一些抓住产业革命机会的大亨将金融专家、法律专家和财务专家集合…...
Typescript快速入门
Typescript快速入门第一章 快速入门0、TypeScript简介1、TypeScript 开发环境搭建2、基本类型3、编译选项4、webpack5、Babel第二章:面向对象0、面向对象简介1、类(class)2、面向对象的特点3、接口(Interface)4、泛型&…...
如何激励你的内容团队产出更好的创意
对于一个品牌而言,如何创造吸引受众并对受众有价值内容是十分关键的。随着市场数字化的推进,优质的创意和内容输出对一个品牌在市场中有着深远的影响。对于很多内容策划和创作者来说,不断地产出高质量有创意的内容是一件非常有挑战性的事情。…...
机械设备管理软件如何选择?机械设备管理软件哪家好?
随着信息化技术的进步与智能制造的发展趋势,很多机械设备制造企业也在一直探寻适合自己的数字化管理转型之路,而企业上ERP管理软件又是实现数字化管理的前提,机械设备管理软件对于企业来说就是关键一环。机械设备管理软件如何选择?…...
深入浅出带你学习shiro-550漏洞
//发点去年存货 前言 apache shiro是一个java安全框架,作用是提供身份验证,Apache Shiro框架提供了一个Rememberme的功能,存储在cookie里面的Key里面,攻击者可以使用Shiro的默认密钥构造恶意序列化对象进行编码来伪造用户的 Cookie…...
wordpress中文页面/360网站推广
一行Python解Leetcode习题 语法简单,提供大量开箱即用的工具是Python语言的一大特点,也是其受欢迎的重要特点。所谓“人生苦短,我用Python”,并不是说Python比其他语言性能好、也不是说Python比其它语言优秀,而是说它方…...
seo点击排名工具/抖音seo排名
CPU使用率高 找出使用率高的进程的pid top 1 找出使用率高的线程tpid top -p pid -H 1 查看使用率高的线程当前在干什么 jstack -l pid > stack.log// 将线程的tpid转为16进制,到stack.log中查找 grep tpid stack.log -a3 1234 GC问题 // -t:打印时间…...
大连网站策划/免费站推广网站在线
Databricks公司通过简化对GPU加速型机器学习方案的访问支持自家云Spark服务。 作为Apache Spark内存内大数据项目的支持与开发合作厂商,Databricks公司已经对其自家Apache Spark云实现方案进行两轮支持升级,旨在让更多IT用户享受其便利。 此次推出的新功…...
网上购物商城系统论文/关键词优化的作用
使用dict和set 阅读: 346206dict Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 举个例子,假设要根据同学…...
上海 网站开发 外包/找精准客户的app
参考链接: ubuntu16.04 检测不到扩展屏幕(解决方案) 系统环境: Ubuntu 18.04.3 LTS 安装过程 使用第三方驱动修改grub引导文件测试 1、使用第三方驱动 这里需要使用第三方驱动。安装好驱动之后,需要重启电脑。 …...
教育机构logo/宁波seo教程
张宴网站中涉及到的加速文章地址: http://blog.s135.com/nginx_cache/2/1/具体参数说明是这样的形式,写得不完善,没有加入自动清理缓存时间 proxy_cache_path /usr/local/nginx/proxy_cache levels1:2 keys_zonecache_one:200m inactive1d ma…...