操作符重载方法: 类(class)通过使用特殊名称的方法(len(self))来实现被特殊语法(len())的调用

类(class)通过使用特殊名称的方法(len(self))来实现被特殊语法(len())的调用

构造 与 析构 方法

class demo1:# 构造方法, 对象实例化时调用def __init__(self):print("构造方法")# 析构方法, 对象被回收时调用def __del__(self):print("析构方法")

new

class demo2(object):# __init__之前调用, 一般用于重写父类的__new__方法, 具体使用见 类 文章的 元类 代码部分(http://blog.csdn.net/rozol/article/details/69317339)def __new__(cls):print("new")return object.__new__(cls)

算术运算

class demo3:def __init__(self, num):self.data = num# +def __add__(self, other):return self.data + other.data# -def __sub__(self, other):return self.data - other.data# *def __mul__(self, other):return self.data * other.data# /def __truediv__(self, other):return self.data / other.data# //def __floordiv__(self, other):return self.data // other.data# %def __mod__(self, other):return self.data % other.data# divmod()def __divmod__(self, other):# 商(10/5),余数(10%5)return self.data / other.data, self.data % other.data# **def __pow__(self, other):return self.data ** other.data# <<def __lshift__(self, other):return self.data << other.data# >>def __rshift__(self, other):return self.data >> other.data# &def __and__(self, other):return self.data & other.data# ^def __xor__(self, other):return self.data ^ other.data# |def __or__(self, other):return self.data | other.dataclass none:def __init__(self, num):self.data = num

反算术运算符(a+b, 若a不支持算术运算符,则寻找b的算术运算符)(注:位置变换, 在原始函数名前+r)

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class demo4:def __init__(self, num):self.data = num# +def __radd__(self, other):return other.data + self.data# -def __rsub__(self, other):return other.data - self.data# *def __rmul__(self, other):return other.data * self.data# /def __rtruediv__(self, other):return other.data / self.data# //def __rfloordiv__(self, other):return other.data // self.data# %def __rmod__(self, other):return other.data % self.data# divmod()def __rdivmod__(self, other):return other.data / self.data, other.data % self.data# **def __rpow__(self, other):return other.data ** self.data# <<def __rlshift__(self, other):return other.data << self.data# >>def __rrshift__(self, other):return other.data >> self.data# &def __rand__(self, other):return other.data & self.data# ^def __rxor__(self, other):return other.data ^ self.data# |def __ror__(self, other):return other.data | self.data

增量赋值运算,(注:位置同原始函数,在原始函数名前+i)

class demo5():def __init__(self, num):self.data = num# +=def __iadd__(self, other):return self.data + other# -=def __isub__(self, other):return self.data - other# *=def __imul__(self, other):return self.data * other# /=def __itruediv__(self, other):return self.data / other# //=def __ifloordiv__(self, other):return self.data // other# %=def __imod__(self, other):return self.data % other# **=def __ipow__(self, other):return self.data ** other# <<=def __ilshift__(self, other):return self.data << other# >>=def __irshift__(self, other):return self.data >> other# &=def __iand__(self, other):return self.data & other# ^=def __ixor__(self, other):return self.data ^ other# |=def __ior__(self, other):return self.data | other

比较运算符

class demo6:def __init__(self, num):self.data = num# <def __lt__(self, other):return self.data < other.data# <=def __le__(self, other):return self.data <= other.data# ==def __eq__(self, other):return self.data == other.data# !=def __ne__(self, other):return self.data != other.data# >def __gt__(self, other):return self.data > other.data# >=def __ge__(self, other):return self.data >= other.data

一元操作符

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class demo7:def __init__(self, num):self.data = num# + 正号def __pos__(self):return +abs(self.data)# - 负号def __neg__(self):return -abs(self.data)# abs() 绝对值def __abs__(self):return abs(self.data)# ~ 按位取反def __invert__(self):return ~self.data# complex() 字符转数字def __complex__(self):return 1+2j# int() 转为整数def __int__(self):return 123# float() 转为浮点数def __float__(self):return 1.23# round()  近似值def __round__(self):return 1.123

格式化

class demo8:# print() 打印def __str__(self):return "This is the demo."# repr() 对象字符串表示def __repr__(self):return "This is a demo."# bytes() 对象字节字符串表现形式def __bytes__(self):return b"This is one demo."# format() 格式化def __format__(self, format_spec):return self.__str__()

属性访问

class demo9:# 获取(不存在)属性def __getattr__(self):print ("访问的属性不存在")# getattr() hasattr() 获取属性def __getattribute__(self, attr):print ("访问的属性是%s"%attr)return attr# setattr() 设置属性def __setattr__(self, attr, value):print ("设置 %s 属性值为 %s"%(attr, value))# delattr() 删除属性def __delattr__(self, attr):print ("删除 %s 属性"%attr)

描述器(类(test1)的实例出现在属主类(runtest)中,这些方法才会调用)(注:函数调用,这些方法不会被调用)

class test1:def __init__(self, value = 1):self.value = value * 2def __set__(self, instance, value):print("set %s %s %s"%(self, instance, value))self.value = value * 2def __get__(self, instance, owner):print("get %s %s %s"%(self, instance, owner))return self.valuedef __delete__(self, instance):print("delete %s %s"%(self, instance))del self.valueclass test2:def __init__(self, value = 1):self.value = value + 0.3def __set__(self, instance, value):print("set %s %s %s"%(self, instance, value))instance.t1 = value + 0.3def __get__(self, instance, owner):print("get %s %s %s"%(self, instance, owner))return instance.t1def __delete__(self, instance):print("delete %s %s"%(self, instance))del self.valueclass runtest:t1 = test1()t2 = test2()

自定义property

class property_my:def __init__(self, fget=None, fset=None, fdel=None):self.fget = fgetself.fset = fsetself.fdel = fdel# 对象被获取(self自身, instance调用该对象的对象(demo9), owner调用该对象的对象类对象(demo9))def __get__(self, instance, owner):print("get %s %s %s"%(self, instance, owner))return self.fget(instance)# 对象被设置属性时def __set__(self, instance, value):print("set %s %s %s"%(self, instance, value))self.fset(instance, value)# 对象被删除时def __delete__(self, instance):print("delete %s %s"%(self, instance))self.fdel(instance)class demo10:def __init__(self):self.num = Nonedef setvalue(self, value):self.num = valuedef getvalue(self):return self.numdef delete(self):del self.numx = property_my(getvalue, setvalue, delete)

自定义容器

class lis:def __init__(self, *args):self.lists = argsself.size = len(args)self.startindex = 0self.endindex = self.size# len() 容器元素数量def __len__(self):return self.size;# lis[1] 获取元素def __getitem__(self, key = 0):return self.lists[key]# lis[1] = value 设置元素def __setitem__(self, key, value):pass# del lis[1] 删除元素def __delitem__(self, key):pass# 返回迭代器def __iter__(self):return self# rversed() 反向迭代器def __reversed__(self):while self.endindex > 0:self.endindex -= 1yield self[self.endindex]# next() 迭代器下个元素def __next__(self):if self.startindex >= self.size:raise StopIteration # 控制迭代器结束elem = self.lists[self.startindex]self.startindex += 1return elem# in / not indef __contains__(self, item):for i in self.lists:if i == item:return Truereturn False

yield 生成器(执行一次返回,下次继续执行后续代码返回)

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def yielddemo():num = 0while 1: # 1 == True; 0 == Falseif num >= 10:raise StopIterationnum += 1yield num

能接收数据的生成器

def yielddemo_1():while 1:num = yieldprint(num)

with 自动上下文管理

class withdemo:def __init__(self, value):self.value = value# 返回值为 as 之后的值def __enter__(self):return self.value# 执行完成,退出时的数据清理动作def __exit__(self, exc_type, exc_value, traceback):del self.valueif __name__ == "__main__":# 构造与析构d1 = demo1()del d1# newd2 = demo2()
算术运算符
d3 = demo3(3)
d3_1 = demo3(5)
print(d3 + d3_1)
print(d3 - d3_1)
print(d3 * d3_1)
print(d3 / d3_1)
print(d3 // d3_1)
print(d3 % d3_1)
print(divmod(d3, d3_1))
print(d3 ** d3_1)
print(d3 << d3_1)
print(d3 >> d3_1)
print(d3 & d3_1)
print(d3 ^ d3_1)
print(d3 | d3_1)
反运算符
d4 = none(3)
d4_1 = demo4(5)
print(d4 + d4_1)
print(d4 - d4_1)
print(d4 * d4_1)
print(d4 / d4_1)
print(d4 // d4_1)
print(d4 % d4_1)
print(divmod(d4, d4_1))
print(d4 ** d4_1)
print(d4 << d4_1)
print(d4 >> d4_1)
print(d4 & d4_1)
print(d4 ^ d4_1)
print(d4 | d4_1)
增量赋值运算(测试时注释其他代码)
d5 = demo5(3)
d5 <<= 5
d5 >>= 5
d5 &= 5
d5 ^= 5
d5 |= 5
d5 += 5
d5 -= 5
d5 *= 5
d5 /= 5
d5 //= 5
d5 %= 5
d5 **= 5
print(d5)

比较运算符

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
d6 = demo6(3)
d6_1 = demo6(5)
print(d6 < d6_1)
print(d6 <= d6_1)
print(d6 == d6_1)
print(d6 != d6_1)
print(d6 > d6_1)
print(d6 >= d6_1)

一元操作符(测试时注释其他代码)

d7 = demo7(-5)
num = +d7
num = -d7
num = abs(d7)
num = ~d7
print(num)
print(complex(d7))
print(int(d7))
print(float(d7))
print(round(d7))

格式化

d8 = demo8()
print(d8)
print(repr(d8))
print(bytes(d8))
print(format(d8, ""))

属性访问

d9 = demo9()
setattr(d9, "a", 1) # => 设置 a 属性值为 1
print(getattr(d9, "a")) # => a / 访问的属性是a
print(hasattr(d9, "a")) # => True / 访问的属性是a
delattr(d9, "a") # 删除 a 属性
# ---
d9.x = 100 # => 设置 x 属性值为 100
print(d9.x) # => x / 访问的属性是x
del d9.x # => 删除 x 属性

描述器

r = runtest()
r.t1 = 100 # =>  <__main__.test1> <__main__.runtest> 100
print(r.t1) # => 200 /  <__main__.test1> <__main__.runtest> <class '__main__.runtest'>
del r.t1 # =>  <__main__.test1> <__main__.runtest>
r.t2 = 200 # => <__main__.test2> <__main__.runtest> 200 / <__main__.test1> <__main__.runtest> 200.3
print(r.t2) # => 400.6 / <__main__.test2> <__main__.runtest> <class '__main__.runtest'> /  <__main__.test1> <__main__.runtest> <class '__main__.runtest'>
del r.t2 # <__main__.test2> <__main__.runtest>

自定义property

d10 = demo10()
d10.x = 100; # => <__main__.property_my> <__main__.demo10> 100
print(d10.x) # => 100 / <__main__.property_my> <__main__.demo10> <class '__main__.demo10'>
del d10.x # => <__main__.property_my> <__main__.demo10>
d10.num = 200;
print(d10.num) # => 200
del d10.num

自定义容器(迭代器Iterator)

lis = lis(1,2,3,4,5,6)
print(len(lis))
print(lis[1])
print(next(lis))
print(next(lis))
print(next(lis))
for i in lis:print (i)
for i in reversed(lis):print (i)
print(3 in lis)
print(7 in lis)
print(3 not in lis)
print(7 not in lis)

yield 生成器(可迭代对象Iterable)

for i in yielddemo():print (i)
# ---
iters = iter(yielddemo())
print(next(iters))
print(next(iters))
# --- 发送数据给生成器 ---
iters = yielddemo_1()
next(iters)
iters.send(6) # 发送数据并执行
iters.send(10)# with 自动上下文管理
with withdemo("Less is more!") as s:print(s)

Python3 操作符重载方法相关推荐

  1. C#构造函数、操作符重载以及自定义类型转换

    构造器 构造器(构造函数)是将类型的实例初始化的特殊方法.构造器可分为实例构造器和类型构造器,本节将详细介绍有关内容. 实例构造器 顾名思义,实例构造器的作用就是对类型的实例进行初始化.如果类没有显示 ...

  2. C#中如何利用操作符重载和转换操作符

    操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...

  3. Python学习手册之内部方法、操作符重载和对象生命周期

    在上一篇文章中,我们介绍了 Python 的类和继承,现在我们介绍 Python 的内部方法.操作符重载和对象生命周期. 查看上一篇文章请点击:https://www.cnblogs.com/dust ...

  4. C++拾趣——有趣的操作符重载

    操作符重载是C++语言中一个非常有用的特性.它可以让我们比较优雅的简化代码,从而更加方便的编写逻辑. 为什么要使用操作符重载 一种常见的用法是重载<<运算符,让标准输出可以输出自定义的类型 ...

  5. C++——构造函数(拷贝构造,拷贝复制),析构函数,操作符重载

    C++--构造函数(拷贝构造,拷贝复制),析构函数,操作符重载 构造函数与析构函数:: 涉及构造函数还可以看这篇文章C++搞懂深拷贝初始化=与赋值=的区别 1.声明和定义构造函数和析构函数 构造函数在 ...

  6. 【Groovy】map 集合 ( map 集合操作符重载 | 使用 << 操作符添加一个元素 | 代码示例 )

    文章目录 一.使用 " << " 操作符添加一个元素 二.代码示例 一.使用 " << " 操作符添加一个元素 对 map 集合 使用 ...

  7. 【Groovy】map 集合 ( map 集合操作符重载 | *. 展开操作符 | 代码示例 )

    文章目录 一.map 集合 " *. " 展开操作符 二.代码示例 一.map 集合 " *. " 展开操作符 对 map 集合使用 " *. &qu ...

  8. 【Groovy】map 集合 ( map 集合操作符重载 | - 操作符重载 | 代码示例 )

    文章目录 一.map 集合 " - " 操作符重载 二.完整代码示例 一.map 集合 " - " 操作符重载 对 map 集合 使用 " - &qu ...

  9. 【Groovy】map 集合 ( map 集合操作符重载 | + 操作符重载 | 代码示例 )

    文章目录 一.map 集合 " + " 操作符重载 二.代码示例 一.map 集合 " + " 操作符重载 对 map 集合使用 " + " ...

最新文章

  1. 还原时代原声,AI修复老北京再次火爆全网
  2. 用Perl发送邮件小例子
  3. 开发日记-20190527 关键词 ubuntu无线网卡驱动安装
  4. 面向对象软件设计——设计模式学习
  5. java泛型数组替代方案_Kotlin泛型Array T导致“不能将T用作具体类型参数 . 使用类代替“但List T不会...
  6. 张磊香港理工大学计算机,香港理工大学张磊博士赴深圳先进院交流
  7. java typereference_记录一下jackson中TypeReference的使用
  8. java基础巩固_(一)Java基础巩固
  9. Spring MVC应用@Autowired和@Service进行依赖注入
  10. 用JS实现一个随机点名系统(五)
  11. 商厂里调货拿包包程序
  12. linux 端口映射
  13. CMMI3-CMMI5认证费用及认证周期
  14. rstp 转hls_海康大华RTSP转HLS直播
  15. Android 知识点 250 —— screencap截屏指令
  16. android外设按键,Android 外接键盘的按键处理 .
  17. html语言设置表格颜色,HTML怎么设置表格单元格颜色
  18. 151只宝可梦(神奇宝贝)倒背的我,却连元素周期表都背不过 -- Python 爬虫小课 3-9
  19. ios点击推送闪退_苹果ios企业签名常见问题及解决方案总结,开发者必看!
  20. 软件工程研究生在读一年总结

热门文章

  1. Laravel5.2之Filesystem-从Dropbox中下载文件到AWS S3
  2. java 获取当月第一天和最后一天 获取前一个月第一天和最后一天
  3. Windows 7 硬盘安装
  4. 【整理】如何翻译SAP事务代码描述
  5. 【整理】视图簇View cluster的创建
  6. 财务凭证过账增强 BAPI_ACC_DOCUMENT_POST
  7. netstat [选项]
  8. SAP ABAP 内表使用
  9. 从Run Simple到Run Live,SAP有哪些新变化?
  10. SAP TABLECONTROL 搜索帮助相关设置