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

相关文章

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

Python运行中频繁出现Restart提示的解决办法

《Python运行中频繁出现Restart提示的解决办法》在编程的世界里,遇到各种奇怪的问题是家常便饭,但是,当你的Python程序在运行过程中频繁出现“Restart”提示时,这可能不仅仅是令人头疼... 目录问题描述代码示例无限循环递归调用内存泄漏解决方案1. 检查代码逻辑无限循环递归调用内存泄漏2.

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

如何将Python彻底卸载的三种方法

《如何将Python彻底卸载的三种方法》通常我们在一些软件的使用上有碰壁,第一反应就是卸载重装,所以有小伙伴就问我Python怎么卸载才能彻底卸载干净,今天这篇文章,小编就来教大家如何彻底卸载Pyth... 目录软件卸载①方法:②方法:③方法:清理相关文件夹软件卸载①方法:首先,在安装python时,下

python uv包管理小结

《pythonuv包管理小结》uv是一个高性能的Python包管理工具,它不仅能够高效地处理包管理和依赖解析,还提供了对Python版本管理的支持,本文主要介绍了pythonuv包管理小结,具有一... 目录安装 uv使用 uv 管理 python 版本安装指定版本的 Python查看已安装的 Python

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Python中局部变量和全局变量举例详解

《Python中局部变量和全局变量举例详解》:本文主要介绍如何通过一个简单的Python代码示例来解释命名空间和作用域的概念,它详细说明了内置名称、全局名称、局部名称以及它们之间的查找顺序,文中通... 目录引入例子拆解源码运行结果如下图代码解析 python3命名空间和作用域命名空间命名空间查找顺序命名空