本文主要是介绍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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!