python 学习汇总49:对象重载魔法 1(进阶学习- tcy)

2024-03-20 09:58

本文主要是介绍python 学习汇总49:对象重载魔法 1(进阶学习- tcy),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录:

1.   对象重载魔法基本介绍

2.  对象重载魔法实例   见博文:对象重载魔法 2

1.__str__,__repr__,__abs__ ,__len__, __reversed__重载2.运算符重载二元运算符重载方法格式: 2.1.算术运算重载2.2.反向算术运算重载2.3.复合赋值算术运算重载4.迭代器(高级):4.1.迭代器重载4.2.可迭代对象重载1.__iter__迭代对象2.支持索引切片5.上下文管理器重载6.__call__重载7.索引和切片运算符的重载[ ]:实例1__repr__,__neg__,__contains__,__getitem__ ,__setitem__ ,__delitem__重载IN 对象检测索引切片    实例2 class 实现list 功能:__len__,__getitem__,__setitem__,__delitem__,__iter__,__reversed__重载8.特性属性重载:__getattr__(self, attr)@property实例8.1.__getattr__动态返回一个属性:利用完全动态__getattr__写出一个链式调用:实例8.2.此示例示意特性属性的用法实例8.3.此示例示意特性属性的用法'9.其他魔法
1.对象创建与销毁:用来定义类
__new__(cls[,*args.**kwargs])  创建新实例时调用的类方法# 通常用在定义元类或继承自不可变类型之一(整形,字符串,元祖等)# 这个函数会在类初始化函数__init__()之前调用__init__(self[,*args,**kwargs])  初始化新实例时调用
__del__(self)                           销毁实例时调用 # 应用在关键资源管理
2.对象字符串
__format__(self,format_spec)     创建格式化后的表示
__repr__(self)                             创建对象的字符串表示
__str__(self)                               创建简单的字符串表示
3.对象测试
__bool__(self)                           真值测试返回false,true
__hash__(self)                          计算整数的散列索引  可变对象不应定义此方法
4.对象比较与排序
__lt__(self,other)            结果self<other
__le__(self,other)           结果self<=other
__gt__(self,other)          结果self>other
__ge__(self,other)         结果self>=other
__eq__(self,other)         结果self=other
__ne__(self,other)         结果self!=other
5.类型检查 用在抽象基类和接口
__instancecheck__(cls,object)       结果:isinstance(object,cls)
__subclasscheck__(cls,sub)          结果:issubclass(sub,cls)
6.属性访问
 __getattribute__(self,name)       返回属性self.name;
调用__getattr__前必定会调用 __getattribute__;要避免"无限递归";    容易出错,应尽量少用。 # 类中所有属性的点号运算都会尝试该方法
__getattr__(self,name)              常规查找未找到属性返回slef.name,无法计算属性引发AttributeError;要避免"无限递归"# 只有类中没有定义的属性点号运算才会尝试该方法
__setattr__(self,name,value)     设置属性self.name=value ;要避免"无限递归"
    # 类中所有属性的赋值语句都会尝试该方法,self.attr=val会变成self.__setattr__('attr',val)
__delattr__(self,name)              删除属性self.name;要避免"无限递归"
7.属性包装与描述符  类似于上面
__get__(self,instance,cls)        返回一个属性
__set__(self,instance,value)    设置属性
__delete__(self,instance)         删除属性 #析构函数__del__是完全不同的
8.序列于映射方法:索引与分片
__len__(self) 返回self的长度 # len([1,2]) [1,2].__len__()
__getitem__(self,key) 返回self[key] #a=[1,2]; x=a[1] x=a.__getitem__(1)
__setitem__(self,key,value) 设置self[key]=value# a[1]=7 a.__setitem__(1,7)
__delitem__(self,key) 删除self[key] # del a[2] a.__delitem__(2)
              # 切片操作
x=a[1:5]                 # x=a.__getitem__(slice(1,5,None))
a[1:3]=[10,11,12]  # a.__setitem__(slice(1,3,None),[10,11,12])
del a[1:3]             # a.__delitem__(slice(1,4,None))
9.迭代
obj.__iter__() 返回一个迭代器对象
iter.__next__() 返回下一个对象
# 在所有的迭代环境中,会先尝试__iter__方法,然后在尝试__getitem__方法,
# 注意迭代器根本没有重载索引表达式,如需通过while来根据下标迭代要定义__getitem__方法
10.数学操作:
1) 数学运算操作
__add__(self,other) 返回self+other
__iadd__, __radd__,__sub__, __isub__, __rsub__
__mul__, __imul__: 乘法
__neg__, __pos__: 表示-obj, +obj
__abs__
__floordiv__, __ifloordiv__, __truediv__, __itruediv__
__mod__, __imod__, __imod__
__pow__, __ipow__# a += b尝试增强加法__iadd__,然后尝试普通加法__add__
# x = b + obj:如果b不是类实例时,会调用右侧加法__radd__
# 当我们把两个实例相加的时候,Python运行__add__,它反过来通过简化左边的运算数来触发__radd__。2)比较大小
__lt__
__le__
__gt__
__ge__
__eq__: #!=和==都会尝试该方法,需要确保两个运算符都正确地作用。# 实例:
class X:
def __init__(self, value):
self.data = value
def __eq__(self, value):
return self.data == valuex = X(4)
print(x ==5)# False
print(x != 5)# True3)对象运算操作
__concat__:比如序列a,b的加法a+b
__iconcat__4)位运算符
__and__, __iand__
__or__, __ior__, __xor__, __ixor__
__inv__, __invert__ : ~obj
__lshift__, __ilshift__, __rshift__, __irshift__a &=b:会先尝试__iand__,然后尝试__add__5)布尔测试
__bool__
__len__
# 布尔测试会先尝试一个特定__bool__方法,然后在尝试__len__方法。6).成员测试
__contains__(self,obj) 如果obj在self中返回True # 5 in a a.__contains__(5)
# in成员测试会先尝试__contains__方法,然后是__iter__方法,最后是__getitem__方法
11.可调用接口
__call__(self,*args,**kwargs) 模拟函数
# x(arg1,arg2,…) 等同于调用于调用x.__call__(self,arg1,arg2,…)class distanceFrom(object):
def __init__(self,origin):
self.origin=origin
def __call__(self,x):
return abs(x-self.origin)nums=[1,37,42,101,13,9,-20]
nums.sort(key=distanceFrom(10)) #按照10的距离排序12.上下文管理协议
__enter__(self) 进入新的上下文
__exit__(self,type,value,tb) 离开上下文 ,返回异常类型,值,跟踪信息with context [as var]: #var方法的返回值
statements13.对象检查
__ dir__(self) 检查对象返回名称列表14.整数值
__index__
# 在bin(X), hex(X), oct(X), O[X], O[X:]等需传入一个数字,索引,分片值时传入一个对象,
# 那么该对象的__index__会被调用。

 

 

 

这篇关于python 学习汇总49:对象重载魔法 1(进阶学习- tcy)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/829096

相关文章

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误

Python中提取文件名扩展名的多种方法实现

《Python中提取文件名扩展名的多种方法实现》在Python编程中,经常会遇到需要从文件名中提取扩展名的场景,Python提供了多种方法来实现这一功能,不同方法适用于不同的场景和需求,包括os.pa... 目录技术背景实现步骤方法一:使用os.path.splitext方法二:使用pathlib模块方法三

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.