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安装时常见报错以及解决方案

《Python安装时常见报错以及解决方案》:本文主要介绍在安装Python、配置环境变量、使用pip以及运行Python脚本时常见的错误及其解决方案,文中介绍的非常详细,需要的朋友可以参考下... 目录一、安装 python 时常见报错及解决方案(一)安装包下载失败(二)权限不足二、配置环境变量时常见报错及

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

Python创建Excel的4种方式小结

《Python创建Excel的4种方式小结》这篇文章主要为大家详细介绍了Python中创建Excel的4种常见方式,文中的示例代码简洁易懂,具有一定的参考价值,感兴趣的小伙伴可以学习一下... 目录库的安装代码1——pandas代码2——openpyxl代码3——xlsxwriterwww.cppcns.c

Python中Markdown库的使用示例详解

《Python中Markdown库的使用示例详解》Markdown库是一个用于处理Markdown文本的Python工具,这篇文章主要为大家详细介绍了Markdown库的具体使用,感兴趣的... 目录一、背景二、什么是 Markdown 库三、如何安装这个库四、库函数使用方法1. markdown.mark

一分钟带你上手Python调用DeepSeek的API

《一分钟带你上手Python调用DeepSeek的API》最近DeepSeek非常火,作为一枚对前言技术非常关注的程序员来说,自然都想对接DeepSeek的API来体验一把,下面小编就来为大家介绍一下... 目录前言免费体验API-Key申请首次调用API基本概念最小单元推理模型智能体自定义界面总结前言最

Python利用PIL进行图片压缩

《Python利用PIL进行图片压缩》有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所以本文为大家介绍了Python中图片压缩的方法,需要的可以参考下... 有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所有可以对文件中的图

一文教你使用Python实现本地分页

《一文教你使用Python实现本地分页》这篇文章主要为大家详细介绍了Python如何实现本地分页的算法,主要针对二级数据结构,文中的示例代码简洁易懂,有需要的小伙伴可以了解下... 在项目开发的过程中,遇到分页的第一页就展示大量的数据,导致前端列表加载展示的速度慢,所以需要在本地加入分页处理,把所有数据先放