Python3 操作符重载方法
生活随笔
收集整理的這篇文章主要介紹了
Python3 操作符重载方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
操作符重載方法: 類(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 Falseyield 生成器(執行一次返回,下次繼續執行后續代碼返回)
''' 遇到問題沒人解答?小編創建了一個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 操作符重载方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中hasattr()、get
- 下一篇: Python 各种读取保存tif,tif