python教程:内置函数和语法糖触发魔法方法

news2024/11/29 0:56:08

前言

大家早好、午好、晚好吖 ❤ ~欢迎光临本文章

如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码

下面总结python内置函数对应的魔法方法

魔法方法

数学计算
  1. abs(args):返回绝对值,调用__abs__;

  2. round(args):返回四舍五入的值,调用__round__;

  3. math.floor():向下取整,调用__floor__;

  4. math.ceil():向上取整,调用__ceil__;

  5. math.trunc():求一个值距离0最近的整数,调用__trunc__;

  6. divmod(a,b):返回商和余,调用__divmod__;

  7. pow(a,b):返回幂,调用__pow__;

  8. sum():返回和,调用__sum__;

  9. float():转换小数,调用__float__;

  10. int():转换整数,调用__int__;

  11. str():转换字符串,调用__str__;

  12. sys.getsizeof():对象占内存的大小,调用__sizeof__;

  13. bin(*args, **kwargs):调用参数的__bin__方法,返回整数的二进制表示形式,只支持一个参数,只支持int类型

  14. hash():调用__hash__方法,获取一个对象的散列值,相等的两个数哈希值相等,反过来不一定成立

  15. hex(*args, **kwargs):调用__hex__方法,求整数的十六进制表示形式,只支持Int类型

  16. oct(*args, **kwargs):调用__oct__方法,求整数的八进制表示形式,只支持Int类型

访问控制
  • __getattr__(self, name):getattr方法触发,仅对对象未定义的属性有效,即如果视图获取一个没有的属性时会调用该方法,前提是该对象未定义

  • __getattribute__(self, name):getattr方法触发,如果对象定义了该方法,一定触发,__getattr__方法将不会被调用;

    它也可以被self.name语法糖触发;

  • __setattr__(self, name, value):setattr方法触发,设置一个对象的属性;

    也可以被self.name = ''语法糖触发。

  • __delattr__(self, name):delattr方法触发,删除一个对象的属性,

    或由del self.name 形式触发;

容器类型

在Python中实现自定义容器类型需要用到一些协议。

不可变容器类型有如下协议:

  1. 不可变容器,需要定义_len_· 和 ·getitem ;

  2. 可变容器,需要定义 lengetitemsetitemdelitem ;

  3. 容器可迭代,需要定义 iter

  4. 迭代器,必须遵守迭代器协议,需要定义_iter_ 和 _next_方法。

索引语法糖与魔法方法
  • __len__(self):返回容器的长度;

  • __getitem__(self, key):使用self[key]形式语法糖获取元素会触发;

  • __setitem__(self, key):使用self[key] = 'xxx’形式复制会触发;

  • __delitem__(self, key):使用del self[key]语法糖触发

  • __reversed__(self):reversed(self)触发,反转容器;

  • __missing__(self, key):字典结构使用self[key]形式获取元素,如果元素不存在触发;

分片语法糖与魔法方法

切片在底层的原理,py2和py3有很大的不同,py2中使用_getslice_、setslice、_delslice__三个魔法方法控制,py3中将索引和切片统一由_getitemsetitem、__delitem__控制。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:702813599
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# py2中
ls = [1,2,3,4]
print(ls[1:3]) # py2中该语法糖调用__getslice__方法,py3中废弃
del ls[1:3] # py2中该语法糖调用__delslice__方法,py3中废弃
ls[1:3] = [1,2,2] # py2中该语法糖调用__setslice__方法,py3中废弃

# py3中
class Person(object):
    def __getitem__(self, item):
        print(item)
        return 'getitem'

    def __setitem__(self, key, value):
        print(key, value)
        return 'setitem'

    def __delitem__(self, key):
        print(key)
        return 'delitem'

if __name__ == "__main__":
    person = Person()
    print(person[0]) # person[0] ==> person.__getitem__(0)
    print(person[0:2]) # person[0:2] ==> person.__getitem__(slice(0,2,None))
    person[0:2] = 'test' # ==> person.__setitem__(slice(0,2,None), 'test')
    del person[0:2] # ==> person.__delitem__(slice(0,2,None))

# 结果
0
getitem
slice(0, 2, None)
getitem
slice(0, 2, None) test
slice(0, 2, None)

python在处理索引语法糖的时候,将索引当做参数传入相关getitem、setitem、delitem的魔法方法;

在处理切片语法糖的时候先调用slice方法得到slice实例对象,将其作为参数调用相关的魔法方法。

拷贝

copy(self):如果对象定义了该方法,copy.copy()就会调用该方法返回拷贝对象;

deepcopy(self, x):如果对象定义了该方法,copy.deepcopy()就会调用该方法返回拷贝对象;

序列化

序列化我们可以简单理解成对任何数据的一种描述方法,如果多种平台遵循了相同的序列化协议,数据之间的传递就会变得方便。

python默认的序列化模块为pickle。

序列化的简单例子
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:702813599
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Person(object):
    def __init__(self):
        self.name = 'cai'

if __name__ == "__main__":
    import pickle
    person = Person()
    with open('./person.txt', 'wb') as f:
        # 序列化后存储
        pickle.dump(person,f)

    with open('./person.txt', 'rb') as f:
        # 反序列化
        per = pickle.load(f)
        print(per.name)

# 我们可以把一个类保存起来,后续读取它直接使用。

相关的魔法方法

  1. __getinitargs__(self):该魔法方法在py3中似乎被废弃,原本的功能是在序列化时获取实例化参数,应该返回一个元组;

  2. __getnewargs__(self):对新式类,通过这个方法改变类在反pickle时传递给__new__ 的参数;应该返回一个参数元组。

  3. __getstate__(self):定义对象被序列化时的状态,而不使用对象的 __dict__属性,必须返回一个字典,他会去替代 __dict__属性,在序列化时被调用;

  4. __setstate__(self,state):当一个对象被反pickle时,如果定义了__setstate__,对象的状态会传递给这个魔法方法,而不是直接应用到对象的__dict__ 属性, state参数是序列化前的__dict__属性。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:702813599
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Person(object):
    def __init__(self,name):
        print('init')
        self.name = name

    def __getinitargs__(self):
        print('initargs')
        return 'zhao',

    def __getnewargs__(self):
        print('newargs')
        return 'wang',

    def __getstate__(self):
        print('getstate')
        return {'name':'xiao'}

    def __setstate__(self, state):
        print('setstate')
        print(state)
        self.__dict__ = state

if __name__ == "__main__":
    import pickle
    person = Person('cai')
    with open('./person.txt', 'wb') as f:
        # 序列化后存储
        pickle.dump(person,f)

    with open('./person.txt', 'rb') as f:
        # 反序列化
        per = pickle.load(f)
        print(per.name)

# 结果
__new__
init
newargs
getstate
__new__
setstate
{'name': 'xiao'}
xiao
说明:

pickle序列化对象之前,先执行__getnewargs__或__new__方法的参数;

然后执行__getstate__方法,返回的值替代对象的__dict__属性值;

反序列化时调用new方法,以getnewargs返回的值作为参数创建实例;

最后调用__setstate__方法,将getstate方法的返回值作为state参数;

所以由于反序列化时不会调用init方法初始化,getinitargs和getnewargs方法的作用都变得不大;

其他

  1. __instancecheck__(self, instance):instance触发,判断对象的类型

  2. __subclasscheck__(self, subclass):issubclass触发,判断一个对象是另一个对象的子类;

  3. __call__:callable触发,判断一个对象是否可调用;

  4. __dir__(self):dir()触发,获取对象的所有属性、方法的名字组成的列表;

__str_和_repr

调用str触发_str_,调用repr()触发_repr_,

但是print()也可以触发__str_和_repr,

如果对象定义了_str_,则print()一般触发_str_,否则触发_repr_;

但列表以及字典等容器总是会使用_repr_ 方法.

__str__和__repr__的区别

一般来说,str 的返回结果在于强可读性,而 repr 的返回结果在于准确性;

默认情况下,在需要却找不到 __str__方法的时候,会自动调用 _repr_方法。

总结

熟悉了python语法糖、内置函数与魔法方法之间的关系后,显然对于如何写好一个优雅易用的类有很大的帮助。

尾语

好了,今天的分享就差不多到这里了!

对下一篇大家想看什么,可在评论区留言哦!看到我会更新哒(ง •_•)ง

喜欢就关注一下博主,或点赞收藏评论一下我的文章叭!!!

最后,宣传一下呀~👇👇👇 更多源码、资料、素材、解答、交流 皆点击下方名片获取呀👇👇👇

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

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

相关文章

GPIO基础知识的概括

GPIO 是通用输入/输出端口的简称,本文以STM32为例进行说明,其他的单片机功能上都是大同小异,学会STM32的GPIO,我们可以触类旁通。 GPIO 的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据…

CMS之织梦导航二级下拉菜单

操作步骤 1、首先&#xff1a; 将下面这段代码贴到templets\default\footer.htm文件里&#xff08;只要在此文件里就行&#xff0c;位置无所谓啦&#xff01;自己看着办&#xff01;&#xff09; <!-- //二级子类下拉菜单&#xff0c;考虑SEO原因放置于底部 --><scr…

最大限度节省采购成本的七种方法

当前经济环境下&#xff0c;降低成本比以往任何时候都更受到企业的重视。降低成本通常是指在采购过程中节省的成本&#xff0c;但其实远不止于此。它还包括通过重新谈判合同条款和条件、改进管理和运营流程&#xff0c;以及数据和技术的智能使用而节省的成本。 节省采购成本的…

提升技术招聘有效性| 杜绝候选人刷题应试

企业在技术人员招聘中&#xff0c;时常出现候选人“笔试考高分&#xff0c;工作写Bug&#xff0c;绩效来垫底”的尴尬窘境&#xff0c;让企业倍感煎熬。不仅浪费时间精力、也增大招人的成本投入。 如何招到真正合适的技术人选&#xff0c;成为摆在企业心头的难题。 合适的技术…

Vue中的生命周期钩子

生命周期钩子 :::warning 注意 所有生命周期钩子的 this 上下文将自动绑定至实例中&#xff0c;因此你可以利用 this 访问 props、data、computed 和 methods 等选项内的数据/函数。这意味着你不应该使用箭头函数来定义一个生命周期方法&#xff0c;因为箭头函数中没有 this&a…

基于Kintex UltraScale系列FPGA KU060/KU115高性能PCIe数据预处理载板(5GByte/s带宽)

PCIE702是一款基于PCIE总线架构的高性能数据预处理FMC载板&#xff0c;板卡具有1个FMC&#xff08;HPC&#xff09;接口&#xff0c;1路PCIe x8主机接口、1个RJ45千兆以太网口、2个QSFP 40G光纤接口。板卡采用Xilinx的高性能Kintex UltraScale系列FPGA作为实时处理器&#xff0…

vuex实现简易购物车加购效果

目录 一、加购效果动图二、前提条件三、开始操作四、解决vuex刷新数据丢失问题五、最终效果 一、加购效果动图 二、前提条件 创建了vue项目&#xff0c;安装了vuex 三、开始操作 目录结构如下&#xff1a; main.js文件中引入store: import Vue from vue import App from ./…

星戈瑞Cyanine7-COOH在生物学和医学中的应用 CY7-COOH

Cyanine7-COOH作为一种近红外荧光染料&#xff0c;在生物学和医学领域应用。以下是一些Cyanine7-COOH在这些领域中可能的应用&#xff1a; 生物荧光成像&#xff1a; Cyanine7-COOH可以用于细胞和组织的荧光成像&#xff0c;特别是在近红外范围内。这个波长范围的荧光信号穿透…

分布式链路追踪系统zipkin【杭州多测师_王sir】

一、部署zipkin环境的方式 》1.docker 2、java -jar 3、运行源码 二、分别可以在Linux系统和Windows系统里面运行zipkin 三、在地址栏输入&#xff1a;http://127.0.0.1:9411 四、zipkin的流程图 由上图可以看出&#xff0c;应用的代码(User Code)发起 Http Get 请求(请…

Unity丨移动相机朝向目标并确定目标在摄像机可视范围内丨摄像机注释模型丨摄像机移动丨不同尺寸模型优化丨

文章目录 问题描述功能展示技术细节小结 问题描述 本文提供的功能是摄像机朝向目标移动&#xff0c;并确定整个目标出现在摄像机视角内&#xff0c;针对不同尺寸的模型优化。 功能展示 提示&#xff1a;这里可以添加技术名词解释 技术细节 直接上代码 using UnityEngine;…

阿里云产品试用系列-函数计算 FC

函数计算&#xff08;Function Compute&#xff09;是一个事件驱动的全托管 Serverless 计算服务&#xff0c;您无需管理服务器等基础设施&#xff0c;只需编写代码并上传&#xff0c;函数计算会为您准备好计算资源&#xff0c;并以弹性、可靠的方式运行您的代码。 如上所示&am…

Selenium 4.11 正式发布--再也不用手动更新chrome driver 了

Selenium 4.11.0 正式发布了&#xff0c;先来看一下主要特性。 Chrome DevTools支持的版本现在是&#xff1a;v113、v114和v115&#xff08;Firefox仍然对所有版本使用v85&#xff09; 通过Selenium Manager支持Chrome For Testing&#xff08;CfT&#xff09; Selenium Manag…

网络基础 (深信服)

一 走进网络世界 1.1.1 企业网络环境介绍 计算机网络类型&#xff1a; LAN ------本地局域网 Local Area Network&#xff1a; •通常指几千米以内的&#xff0c;可通过某种介质互联的计算机、打印机、modem或其他设备的集合 WAN ------ 广 域 网 Wide Area Network&am…

ClickHouse分布式集群部署

目录 ​编辑 一、环境说明 二、安装部署 2.1 RPM方式安装 2.1.1 安装yum-utils 2.1.2 配置yum repo源 2.1.3 yum install 下载安装clickhouse 2.2 信息配置 2.2.1 配置外网可访问地址 2.2.2 修改存储路径 2.2.2.1 新建存储目录 2.2.2.2 授权 2.2.2.3 修改配置 2.…

Tomcat的启动问题

今天去打开Tomcat的时候没反应 如下 按之前是到Tomcat目录下的bin目录下的startup.bat文件&#xff0c;双击&#xff0c;就可以启动Tomcat服务器。启动后可以 打开浏览器&#xff0c;在浏览器地址栏中输入以下地址测试&#xff1a; 1、http://localhost:8080 2、http://127.…

手撕 LFU 缓存

大家好&#xff0c;我是 方圆。LFU 的缩写是 Least Frequently Used&#xff0c;简单理解则是将使用最少的元素移除&#xff0c;如果存在多个使用次数最小的元素&#xff0c;那么则需要移除最近不被使用的元素。LFU 缓存在 LeetCode 上是一道困难的题目&#xff0c;实现起来并不…

Fair下发产物-布局DSL生成原理

一、概述 大家都知道,Flutter在release环境是以AOT模式运行的,这就决定了我们要做动态化的话无法简单的通过动态下发dart代码执行的。根据Fair团队的前期调研,我们对布局动态化和逻辑动态化的实现采用了两套不同的实现方案,对于布局部分,我们在解析dart源文件之后生成DSL…

xterm使用

xterm使用 前言1. xterm介绍2. xterm使用2.1 xterm简单示例2.2 xterm监听输入并在终端中实时显示方式1:onKey监听方式2:onData监听onData和onKey什么区别 2.3 xterm与vue整合2.3 xterm vue websocket 附录配置说明 前言 vue与xterm整合记录 1. xterm介绍 xterm 是一个基于…

jvm深入研究文档--java中的堆--详解!--jvm底层探索(1)

阿丹&#xff1a; JVM的内存分区包括以下几个部分&#xff1a; 堆区&#xff08;Heap&#xff09; - 这是JVM的主要部分&#xff0c;用于存储实例对象和大多数Java对象&#xff0c;如数组和用户定义的类。方法区&#xff08;Method Area&#xff09; - 这是线程私有的&#x…

内网穿透的应用-NAS私有云存储 - 搭建Nextcloud私有云盘并公网远程访问

文章目录 摘要1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 摘要 Nextcloud,它是ownCloud的一个分支,是一个文件共享服…