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

python魔术方法

魔术方法

  • 魔术方法就是一个类中的方法,和普通方法唯一的不同是普通方法需要调用,而魔术方法是在特定时刻自动触发。
  • 这些魔术方法的名字特定,不能更改,但是入口参数的名字可以自己命名。

基本魔术方法

new(cls[,…])

_new_ 是在一个对象实例化的时候所调用的第一个方法,而不是init,new方法返回的是对象

init(self[,…])

构造器,当一个实例被创建的时候调用的初始化方法

del(self)

构造器,当一个实例被销毁的时候调用的方法

call(self,[,args…])

允许一个类的实例像函数一样被调用:x(a,b) 调用 x.call(a,b),如果没有__call__函数,不能把实例像函数一样调用,而要用x.function(a,b)调用实例x的实例化方法

len(self)

定义当被len()调用时的行为

class Foo(object):# __new__是一个魔术方法,并且是实例化对象时第一个调用的方法,返回的结果是实例化对象。def __new__(cls,*agrs,**cwds):print('调用__new__方法')inst = object.__new__(cls,*agrs,**cwds)print(inst)                       # 返回的是一个对象return inst # __init__的第一个参数self是__new__魔术方法返回的结果def __init__(self,price = 50):print('调用__init__方法')print(self)                       # self是__new__方法返回的东西,因此self命名为其他名称也可以接受__new__返回的对象self.price = pricedef how_much_of_book(self,n):print('调用how_much_of_book方法')print(self)return self.price * ndef __call__(self,m,n):print('调用__call__方法')self.how_much_of_book(n)          # 类里面可以随便这样调用其他方法return self.price * nfoo = Foo()                               # 实例化Foo()返回一个对象
print(foo.how_much_of_book(8))
print(foo(3,2))                          # 如果没有__call__(self,m,n),foo()会报错,只能通过foo.function来调用# 调用__new__方法
# <__main__.Foo object at 0x00000230D9AA2070>
# 调用__init__方法
# <__main__.Foo object at 0x00000230D9AA2070>
# 调用how_much_of_book方法
# <__main__.Foo object at 0x00000230D9AA2070>
# 400
# 调用__call__方法
# 调用how_much_of_book方法
# <__main__.Foo object at 0x00000230D9AA2070>
# 100

比较的魔术方法

  • _cmp_(self,other)

是比较方法里面最基本的魔术方法,它实际上实现了所有的比较符号(<,==,!=,etc.)。__cmp__方法是你想要实现所有的比较符号而一个保持清楚明白的一个好的方法。但是通常最好的一种方式是去分别定义每一个比较符号而不是一次性将他们都定义。

  • _eq_(self,other) 定义相等符号的行为,==
  • _ne_(self,other) 定义不等于符号的行为,!=
  • _It_(self,other) 定义小于符号的行为,<
  • _gt_(self,other) 定义大于符号的行为,>
  • _le_(self,other) 定义小于相等符号的行为,<
  • _ge_(self,other) 定义大于相等符号的行为,>=
class new_list:def __init__(self,a):self.a = a# 实例化方法比较两个实例大小def gt(self,other):    list1 = list(filter(lambda x:type(x)==int,self.a))list2 = list(filter(lambda x:type(x)==int,other.a))if sum(list1)>sum(list2):return Trueelse:return False# 魔术方法比较两个实例大小def __gt__(self,other):    # 如果类中没有 def __ge__()这个魔术方法,那么 print(object1 > object2) 就会报错list1 = list(filter(lambda x:type(x)==int,self.a))list2 = list(filter(lambda x:type(x)==int,other.a))if sum(list1)>sum(list2):return Trueelse:return Falselist1 = new_list([1,2,3,22222,'sdd','da','dasdas'])
list2 = new_list([23,'3213',232,'qdv'])
list3 = new_list([1,21,3,22,99999,'sdd','da','dasdas'])print(list1 > list2)          # 魔术方法比较
print(list1 > list3)          # 魔术方法比较
print(list1.gt(list2))        # 实例化方法比较
print(list1.gt(list3))        # 实例化方法比较
print(list3 > list1 > list2)  # 第一个大于符号会触动一下魔术方法,第二个大于符号也会触动一下魔术方法
print(list1 > list2 > list3)# True
# False
# True
# False
# True
# Falsedef __init__(self,a,b):self.a = aself.b = bdef __str__(self):  # __str__定义当被str()调用时的行为return str(self.a + self.b)object2 = A(3,4)       # 实例化对象print(str(object2))    # 如果没有__str__魔术方法,打印的实例化对象的地址,有__str__魔术方法,该语句相当于调用 print(object2.__str__())

容器类型的魔术方法

  • _len_(self) 定义当被len()调用时的行为,返回容器中元素的个数
  • _getitem_(self,key) 定义获取容器中指定元素的行为,相当于self[key]
  • _setitem_(self,key,value) 定义设置容器中指定元素的行为,相当于self[key] = value
  • _delitem_(self,key) 定义删除容器中指定元素的行为,相当于del self[key]
  • _iter_(self) 定义当迭代容器中的元素的行为
  • _reversed_(self) 定义当被reversed()调用时的行为
  • _contains_(self,item) 定义当使用成员测试运算符(in 或 not in)时的行为
class NewDataType:def __init__(self,data):self.data = datadef __len__(self):return len(self.data)def __getitem__(self,key):return self.data[key]object1 = NewDataType(['1','2','4',33,44])  # 实例化对象时是否传入参数,根据init来定
print(len(object1))
# 5print(object1[-1])
for i in object1:   # 如果没有__getitem__(self,key),无法进行遍历的print(i)# 44
# 1
# 2
# 4
# 33
# 44
class MyIter:def __init__(self,total,start=0):self.total = totalself.start = startdef __iter__(self):return selfdef __next__(self):    # 既可以通过for循环访问也可以通过 next()方法访问if self.start < self.total:self.start += 1return self.startelse:raise StopIterationmyIter = MyIter(3)
it1 = iter(myIter)   # 这个函数触发 __iter__(self):
for i in it1:  print(i)myIter = MyIter(4)   # 必须要再实例化对象一次,才能调用 it2 = iter(myIter),不能直接调用 it2 = iter(myIter)
it2 = iter(myIter)   # 这个函数触发 __iter__(self):
print(next(it2))
print(next(it2))
print(next(it2))# 1
# 2
# 3
# 1
# 2
# 3

作者:小王同学在积累
链接:https://www.zhihu.com/question/432522820/answer/1603434522
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章:

python魔术方法

魔术方法 魔术方法就是一个类中的方法&#xff0c;和普通方法唯一的不同是普通方法需要调用&#xff0c;而魔术方法是在特定时刻自动触发。这些魔术方法的名字特定&#xff0c;不能更改&#xff0c;但是入口参数的名字可以自己命名。 基本魔术方法 new(cls[,…]) _new_ 是在…...

从0开始学python -48

Python CGI编程-3 CGI中使用Cookie 在 http 协议一个很大的缺点就是不对用户身份的进行判断&#xff0c;这样给编程人员带来很大的不便&#xff0c; 而 cookie 功能的出现弥补了这个不足。 cookie 就是在客户访问脚本的同时&#xff0c;通过客户的浏览器&#xff0c;在客户硬…...

当面试官问我前端可以做的性能优化有哪些

面试过程中面试官问到前端性能优化有哪些&#xff0c;当我咔咔一顿输出之后面试官追问&#xff1a;前端可以做的性能优化有哪些呢&#xff1f; 前端优化大概可以有以下几个方向&#xff1a; 网络优化页面渲染优化JS优化图片优化webpack打包优化React优化Vue优化 网络优化 D…...

一文读懂Java/O流的使用方法和技巧

1.前言 Java 中的 I/O 流是实现输入和输出的一种机制&#xff0c;可以用来读写文件、网络、内存等各种资源。Java 提供了各种类型的流&#xff0c;包括字节流和字符流&#xff0c;以及面向文本和二进制数据的流。在本文中&#xff0c;我们将深入探讨 Java I/O 流的各个方面&am…...

AI for Science系列(二):国内首个基于AI框架的CFD工具组件!赛桨v1.0 Beta API介绍以及典型案例分享!

AI for Science被广泛认为是下一代科研范式&#xff0c;可以有效处理多维度、多模态、多场景下的模拟和真实数据&#xff0c;解决复杂推演计算问题&#xff0c;加速新科学问题发现[1] 。百度飞桨科学计算工具组件赛桨PaddleScience是国内首个公开且可应用于CFD&#xff08;Comp…...

SpringCloud简单介绍

文章目录1. 开源组件2. CAP原则1. 开源组件 功能springcloud netflixspringcloud alibabaspringcloud官方其他服务注册与发现eurekanacosconsulzookeeper负载均衡ribbondubbo服务调用openFeigndubbo服务容错hystrixsentinel服务网关zuulgateway服务配置的同一管理cofig-server…...

《uniapp基础知识》学习笔记Day38-(Period2)全局文件一些常用的配置

如果进行开发的话&#xff0c;首先要配置路由页面 page.json 页面路由 pages.json 文件用来对 uni-app 进行全局配置&#xff0c;决定页面文件的路径、窗口样式、原生的导航栏、底部的原生tabbar 等。 {"pages": [{"path": "pages/component/index…...

APICloud 弹动与滚轴冲突的解决模拟

当打开页面的bounces开关来实现下拉刷新和上翻加载是&#xff0c;如果页面中有scroll-view&#xff0c;那么手指上下滑动时弹动会触发&#xff0c;而滚轴无法正常实现&#xff0c;只有按住不动再拖动滚轴才会触发。开始想通过获取手指点击屏幕的坐标点设置触发条件来解决两者的…...

Spring Cloud(微服务)学习篇(四)

Spring Cloud(微服务)学习篇(四) 1.nacos实现服务之间传参数 1.1 在dto包(shop-sms-api项目)中创建SmsDTO类 package com.zlz.shop.sms.api.dto;import lombok.Data;Data public class SmsDTO {private String tel; }1.2 复制SmsDTO类到shop-sms-server项目的dto包下面 1.3 …...

【Java Pro】001-Java基础:面向对象

【Java Pro】001-Java基础&#xff1a;面向对象 文章目录【Java Pro】001-Java基础&#xff1a;面向对象一、面向对象1、什么是对象现实生活中的对象与程序中的对象2、什么是面向对象面向过程面向对象3、面向过程与面向对象的比较思想方面设计方式方面实现方式方面4、面向过程与…...

ElasticSearch从0到1——基础知识

1.ES是什么&#xff1f; 是一个开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据&#xff1b;本身扩展性很好&#xff0c;可以扩展到上百台服务器&#xff0c;处理PB级别的数据使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能&…...

【面试系列】equals和==的区别

问题&#xff1a;两个对象值相同(x.equals(y) true)&#xff0c;但是可能存在hashCode不同吗? 的定义 比较的是两个对象的内存地址&#xff0c;相等则意味着内存地址一样。 对象的equals方法 Object#equals public boolean equals(Object obj) {return (this obj);}Stri…...

存在重复元素模块-三道题

文章目录存在重复元素217. 存在重复元素219. 存在重复元素 II220. 存在重复元素 III &#xff08;SortedList二分&#xff09;小结存在重复元素 217. 存在重复元素 题目链接&#xff1a;217. 存在重复元素 题目大意&#xff1a;给你一个整数数组 nums 。如果任一值在数组中出…...

3种方法删除7-Zip压缩包的密码

7-Zip压缩软件是一款完全免费且开源的软件&#xff0c;不仅能压缩和解压7-Zip压缩包&#xff0c;还能给压缩包设置打开密码。 有些小伙伴可能会遇到这样的问题&#xff0c;7-Zip压缩包设置密码后&#xff0c;过了一段时间不需要密码保护了&#xff0c;或者一不小心忘记了密码&…...

Codeforces Round 855 (Div. 3)(A~F)

A. Is It a Cat?定义满足条件的字符串为&#xff1a;其中仅可能含有meow四种字母的大小写&#xff0c;而且相同种类的字母必须挨在一起&#xff0c;四种字母的顺序必须按照meow排列。给出一个字母串&#xff0c;求是否满足条件。思路&#xff1a;感觉是个很麻烦的模拟。首先把…...

【SpringCloud】SpringCloud详解之Feign实战

目录前言SpringCloud Feign远程服务调用一.需求二.两个服务的yml配置和访问路径三.使用RestTemplate远程调用(order服务内编写)四.使用Feign远程调用(order服务内配置)五.自定义Feign配置(order服务内配置)六.Feign配置日志(oder服务内配置)七.Feign调优(order服务内配置)八.抽…...

tuts4you上lena‘s40个crackme(1)

本来是不打算写文章了&#xff0c;因为懒&#xff0c;想以后通过录屏的形式保存一下自己学的路程。但奈何开学后一直没找到机会&#xff0c;在宿舍也不愿意大吼大叫的讲东西&#xff0c;只好再写写文章了 最近学了一些汇编语言和逆向工程&#xff0c;所以就想通过这40给题目来看…...

研讨会回顾 | Perforce版本控制工具Helix Core入华十年,携手龙智赋能企业大规模研发

2023年2月28日&#xff0c;龙智联合全球领先的数字资产管理工具厂商Perforce共同举办Perforce on Tour网络研讨会&#xff0c;主题为“赋能‘大’研发&#xff0c;助力‘快’交付”。 作为Perforce Helix Core产品在中国地区的唯一授权合作伙伴&#xff0c;龙智董事长何明女士为…...

C++ vscode 开发环境搭建

C vscode 开发环境搭建 笔记内容&#xff1a; C vscode 开发环境搭建准备了解g命令编译调试掌握使用launch.json和tasks.json配置文件编译调试了解使用cmake构建 git: https://github.com/weichangk/hellocpp/tree/master/vscodecmakecpp 环境搭建准备 安装vscode安装qt&a…...

ANR系列(二)——ANR监听方案之SyncBarrier

前言 在项目中经常遇到了手机假死问题&#xff0c;无规律的偶现问题&#xff0c;大量频繁随机操作后&#xff0c;便会出现假死&#xff0c;整个应用无法操作&#xff0c;不会响应事件&#xff0c;会发生各种奇怪的ANR&#xff0c;且trace不固定。而SyncBarrier是其中的罪魁祸首…...

通过Taotoken CLI工具一键为团队统一配置开发环境

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过Taotoken CLI工具一键为团队统一配置开发环境 在团队协作开发中&#xff0c;为新成员配置统一的AI模型调用环境常常是个繁琐的…...

AI产品技能库:将顶尖产品智慧注入Claude Code的实战指南

1. 项目概述&#xff1a;当AI助手遇上产品大师的智慧如果你是一名产品经理、创业者&#xff0c;或者任何需要与产品打交道的人&#xff0c;最近可能已经感受到了AI助手带来的效率革命。无论是用Claude Code写代码&#xff0c;还是用ChatGPT梳理思路&#xff0c;这些工具正在成为…...

SAP ABAP开发避坑指南:NATIVE SQL里那个冒号和MANDT字段,你写对了吗?

SAP ABAP开发实战&#xff1a;NATIVE SQL高频陷阱与性能优化全解析 在SAP ABAP开发领域&#xff0c;NATIVE SQL就像一把双刃剑——它既能突破Open SQL的限制直接操作底层数据库&#xff0c;又隐藏着无数让开发者"踩坑"的语法细节。根据SAP官方统计&#xff0c;超过60…...

如何使用DevPod打造你的终极开源云开发环境:完整指南

如何使用DevPod打造你的终极开源云开发环境&#xff1a;完整指南 【免费下载链接】devpod Codespaces but open-source, client-only and unopinionated: Works with any IDE and lets you use any cloud, kubernetes or just localhost docker. 项目地址: https://gitcode.c…...

别再折腾Bootloader了!STM32H7内部Flash+QSPI Flash混合运行实战(MDK配置详解)

STM32H7混合存储架构开发实战&#xff1a;告别Bootloader的繁琐时代 在嵌入式开发领域&#xff0c;STM32H7系列凭借其高性能Cortex-M7内核和丰富的外设资源&#xff0c;已成为工业控制、智能设备和图形界面应用的宠儿。然而&#xff0c;传统开发模式中Bootloader与应用程序分离…...

用Arduino UNO和L298N驱动板,手把手教你让麦轮小车原地画个‘8’字(附完整代码)

用Arduino UNO和L298N驱动板实现麦轮小车8字轨迹编程实战 想让你的麦克纳姆轮小车跳出机械舞步吗&#xff1f;一个完美的"8"字轨迹不仅能展示麦轮的全向移动特性&#xff0c;更是检验运动控制算法的绝佳试金石。作为已经完成基础搭建的Arduino玩家&#xff0c;这个项…...

准备转型AI产品经理的朋友,建议看看这本书

本文从《AI即未来&#xff1a;普通人用好人工智能的18大工作场景》出发&#xff0c;深入探讨了AI大模型的选择、部署及评估。文章指出&#xff0c;面对众多AI工具&#xff0c;应根据任务需求、输出质量、成本等因素进行选择&#xff0c;并强调AI更像助手&#xff0c;需人类监督…...

Zotero插件市场TOP1新势力:Perplexity Connector v2.3正式发布,支持LLM上下文感知文献溯源,仅限前500名开发者早鸟激活

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Perplexity Zotero整合方案全景概览 Perplexity 作为新一代 AI 驱动的研究型搜索引擎&#xff0c;其核心优势在于实时引用溯源与上下文感知问答&#xff1b;Zotero 则是学术工作者广泛采用的开源文献管…...

企业智能体架构解析:从LLM集成到自动化管理实践

1. 项目概述&#xff1a;一个面向企业管理的智能体架构最近在开源社区里&#xff0c;我注意到一个挺有意思的项目&#xff1a;kernelshreyak/company-manager-agent。光看这个名字&#xff0c;你可能会联想到一个简单的任务管理工具&#xff0c;但深入研究后&#xff0c;我发现…...

Serverless平台为何总让人“又爱又恨”?揭秘Lovable设计的3层情感化架构(开发者体验×运维韧性×业务敏捷)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Serverless平台为何总让人“又爱又恨”&#xff1f; Serverless 架构在现代云原生开发中已成为主流选择&#xff0c;它承诺“无需管理服务器”&#xff0c;让开发者专注业务逻辑。然而&#xff0c;在真…...