电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

解析python高級異常和運算符重載

瀏覽:38日期:2022-06-16 17:26:30
目錄一、高級異常二、環(huán)境管理器2.1、對象的屬性管理函數(shù)三、運算符重載3.1、算術(shù)運算符的重載四、反向算術(shù)運算符的重載五、復(fù)合賦值算術(shù)運算符的重載六、比較運算符的重載七、位運算符重載八、反向位運算符重載九、復(fù)合賦值位運算符重載十、一元運算符的重載十一、in / not in 運算符的重載十二、索引和切片運算符的重載十三、slice 構(gòu)造函數(shù)一、高級異常

回顧異常相關(guān)的語句:

try-except:用來捕獲異常的通知

try-finally:用來做一定要做的事

reise:用來發(fā)生異常通知

assert:用來根據(jù)條件來發(fā)出AssertionError類型的異常通知

with語句:

語句: with 表達式1 [as 變量1],表達式2 [as 變量2]:

         語句塊

作用:使用于對資源進行訪問的場合,確保使用過程中不管是否發(fā)生異常,都會執(zhí)行必須的’清理’操作,并釋放資源

如:文件使用后自動關(guān)閉;線程中鎖定的自動獲取和釋放等

用with語句代替try-finally語句

def read_from_file(filename=’info.txt’): try: with open(filename) as f: print('正在讀取文件') n = int(f.read()) print(’n=’, n) print(’文件已經(jīng)關(guān)閉’) # f = open(filename) # try: # print('正在讀取文件') # n = int(f.read()) # print('n=', n) # finally: # f.close() # print('文件已經(jīng)關(guān)閉') except OSError: print('文件打開失敗') read_from_file()二、環(huán)境管理器

1、類內(nèi)有__enter__和__exit__實例方法的類被稱為環(huán)境管理器

2、能夠用with語句管理的對象必須是環(huán)境管理器

3、 __enter__方法將在進入with語句時被調(diào)用,并返回由as變量管理的對象

4、__exit__將在離開with語句時被調(diào)用,且可以用參數(shù)來判斷在離開with語句時是否有異常發(fā)生并做出相應(yīng)的處理

class A: def __enter__(self): print('已進入with語句') return self # 返回的對象將由 as綁定 def __exit__(self, exc_type, exc_val, exc_tb): print('已離開with語句') # a = A() with A() as a: print('這是with語句內(nèi)的一條語句') int(input('請輸入整數(shù): '))

已進入with語句

這是with語句內(nèi)的一條語句

請輸入整數(shù): 2

2.1、對象的屬性管理函數(shù)

1、getattr(obj, name[, default])從一個對象得到對象的屬性;getattr(x, ’y’)等同于x.y;當(dāng)屬性不存在時,如果給出default參數(shù),則返回default,如果沒有給出default則產(chǎn)生一個AttributeError錯誤

2、hasattr(obj, name)用給定的name返回對象obj是否有此屬性,此種做法可以避免在getattr(obj, name)時引發(fā)錯誤

3、setattr(obj, name, value)給對象obj的名為name的屬性設(shè)置相應(yīng)的值value, set(x,’y’, v) 等同于 x.y = v

4、delattr(obj, name)刪除對象obj中的name屬性,delattr(x, ’y’) 等同于 del x.y

class Car: def __init__(self, c, b): self.color, self.brand = c, b def get_car_attr(self, attr_name): ’’’此方法用于獲取對象的屬性,如果屬性名attr_name 在此對象內(nèi)不存在則返回 None ’’’ return getattr(self, attr_name, None) c1 = Car(’黑色’, ’Benz’) v = c1.get_car_attr(’color’) # try: # v = c1.__dict__[’aaaaa’] # except KeyError: # v = None if v is None: print('沒有顏色屬性') else: print('顏色是:', v)getatter(obj,name[,default])三、運算符重載

讓自定義的類生成的對象(實例)能夠使用運算符進行操作

作用:讓自定義的類的實例像內(nèi)建對象一樣能夠運行運算符操作,讓程序簡單易讀,對自定義的對象,將運算符賦予新的運算規(guī)則

3.1、算術(shù)運算符的重載

__add__(self, rhs)  self + rhs 加法__sub__(self, rhs)self - rhs 減法__mul__(self, rhs)self * rhs 乘法__truediv__(self, rhs) self / rhs 除法__floordiv__(self, rhs) self // rhs 地板除法__mod__(self, rhs)self % rhs 求余__pow__(self, rhs) self ** rhs ??/p>

注: rhs (right hands side) 右手邊

class MyNumber: def __init__(self, v): self.data = v def __repr__(self):return ’MyNumber(%d)’ % self.data # def myadd(self, other): # v = self.data + other.data # return MyNumber(v) def __add__(self, other):print('__add__被調(diào)用') v = self.data + other.data return MyNumber(v) def __sub__(self, rhs): v = self.data - rhs.data return MyNumber(v) n1 = MyNumber(100) n2 = MyNumber(200) # n3 = n1.myadd(n2) # n3 = n1.__add__(n2) n3 = n1 + n2 # __add__被調(diào)用 print(n3) # MyNumber(300) n4 = n3 - n2 print(n4) # MyNumber(100)

class MyList: def __init__(self, iterable): self.data = list(iterable) def __add__(self, rhs): return MyList(self.data + rhs.data) def __repr__(self): return ’MyList(%r)’ % self.data def __mul__(self, rhs): # rhs 綁定整數(shù) return MyList(self.data * rhs) L1 = MyList([1, 2, 3]) L2 = MyList([4, 5, 6]) L3 = L1 + L2 # 等同于L1.__add__(L2) print(L3) # MyList([1,2,3,4,5,6]) L4 = L2 + L1 # 等同于L2.__add__(L1) print(L4) # MyList([4,5,6,1,2,3]) L5 = L1 * 2 # L1.__mul__(2) print(L5) # MyList([1,2,3,1,2,3])四、反向算術(shù)運算符的重載

__radd__(self, lhs)lhs + self 加法__rsub__(self, lhs) lhs - self 減法__rmul__(self, lhs) lhs * self 乘法__rtruediv__(self, lhs) lhs / self 除法__rfloordiv__(self, lhs) lhs // self 地板除法__rmod__(self, lhs) lhs % self 求余__rpow__(self, lhs) lhs ** self ??/p>

class MyList: def __init__(self, iterable): self.data = list(iterable) def __add__(self, rhs): return MyList(self.data + rhs.data) def __repr__(self):return ’MyList(%r)’ % self.data def __mul__(self, rhs): # rhs 綁定整數(shù) print(’__mul__被調(diào)用’) return MyList(self.data * rhs) def __rmul__(self, lhs): print(’__rmul__被調(diào)用’) return MyList(self.data * lhs) L1 = MyList([1, 2, 3]) L2 = MyList([4, 5, 6]) L5 = L1 * 2 # L1.__mul__(2) print(L5) # MyList([1,2,3,1,2,3]) L6 = 2 * L1 # 2.__mul__(L1) print(L6)五、復(fù)合賦值算術(shù)運算符的重載

__iadd__(self, rhs) self += rhs 加法__isub__(self, rhs)self -= rhs 減法__imul__(self, rhs)self *= rhs 乘法__itruediv__(self, rhs) self /= rhs 除法__ifloordiv__(self, rhs) self //= rhs 地板除法__imod__(self, rhs)self %= rhs 求余__ipow__(self, rhs)self **= rhs ??/p>

class MyList: def __init__(self, iterable):print('aaaaaaaaaaaaaaaaaaaaaaaaaaaaa')self.data = list(iterable) def __add__(self, rhs):print(’__add__被調(diào)用’)return MyList(self.data + rhs.data) def __repr__(self):return ’MyList(%r)’ % self.data def __iadd__(self, rhs):print('__iadd__被調(diào)用!!!!')self.data.extend(rhs.data)return selfL1 = MyList([1, 2, 3]) # aaaaaaaaaaaaaaaaaaaaaaaaaaaaaL2 = MyList([4, 5, 6]) # aaaaaaaaaaaaaaaaaaaaaaaaaaaaaL1 += L2 # 當(dāng)沒有__iadd__方法時,等同于調(diào)用L1 = L1 + L2 __iadd__被調(diào)用!!!!print(L1) # MyList([1, 2, 3, 4, 5, 6])六、比較運算符的重載

__lt__(self, rhs) self < rhs 小于__le__(self, rhs) self <= rhs 小于等于__gt__(self, rhs) self > rhs 大于__ge__(self, rhs) self >= rhs 大于等于__eq__(self, rhs) self == rhs 等于__ne__(self, rhs) self != rhs 不等于

注:比較運算符通常返回True或False

七、位運算符重載

__invert__(self)   ~ self 取反(一元運算符)__and__(self, rhs) self &  rhs 位與__or__(self, rhs)  self |  rhs 位或__xor__(self, rhs) self ^  rhs 位異或__lshift__(self, rhs) self << rhs 左移__rshift__(self, rhs) self >> rhs 右移

八、反向位運算符重載

__rand__(self, lhs) lhs &  self 位與__ror__(self, lhs) lhs |  self 位或__rxor__(self, lhs) lhs ^  self 位異或__rlshift__(self, lhs) lhs << self 左移__rrshift__(self, lhs) lhs >> self 右移

九、復(fù)合賦值位運算符重載

__iand__(self, rhs) self &=  rhs 位與__ior__(self, rhs) self |=  rhs 位或__ixor__(self, rhs) self ^=  rhs 位異或__ilshift__(self, rhs) self <<= rhs 左移__irshift__(self, rhs) self >>= rhs 右移

十、一元運算符的重載

__neg__(self) - self 負號__pos__(self)+ self 正號__invert__(self) ~ self 取反

一元運算符的重載方法:

class 類名:def __xxx__(self):

class MyList: def __init__(self, iterable):print('__init__被調(diào)用')self.data = list(iterable) def __repr__(self):return ’MyList(%r)’ % self.data def __neg__(self):’’’此方法用來制定 - self 返回的規(guī)則’’’# L = [-x for x in self.data]L = (-x for x in self.data)return MyList(L)L1 = MyList([1, -2, 3, -4])L2 = -L1print(L2)

運算符重載說明:

運算符重載不能改變運算符的優(yōu)先級

Python類名最好用駝峰命名法:

MyList MyRange 大駝峰(所有單詞首字母大寫,其余小寫) getStudentAge 小駝峰(第一個單詞首字母小寫,其它首字母大寫)十一、in / not in 運算符的重載

重載方法:

__contains__(self, e) e in self 成員運算

class MyList: def __init__(self, iterable):print('__init__被調(diào)用')self.data = list(iterable) def __repr__(self):return ’MyList(%r)’ % self.data def __contains__(self, e):’’’此方法用來實現(xiàn) in / not in 運算符的重載’’’print('__contains__被調(diào)用')for x in self.data: if x == e:return Truereturn FalseL1 = MyList([1, -2, 3, -4])if -2 in L1: print(’-2 在 L1 中’)else: print(’-2 不在 L1中’)# 當(dāng)MyList的類內(nèi)重載了__contains__方法,則not in也同時可用if -3 not in L1: print('-3 不在 L1中')else: print(’-3 在 L2中’)十二、索引和切片運算符的重載

__getitem__(self, i) x = self[i] 索引/切片取值__setitem__(self, i, v) self[i] = v 索引/切片賦值__delitem__(self, i) del self[i] del語句刪除索引等

作用:

讓自定義的類型的對象能夠支持索引和切片操作

class MyList: def __init__(self, iterable):print('__init__被調(diào)用')self.data = list(iterable) def __repr__(self):return ’MyList(%r)’ % self.data def __getitem__(self, i):print('__getitem__被調(diào)用, i=', i)# if type(i) is not int:# raise TypeErrorreturn self.data[i] def __setitem__(self, i, v):print('__setitem__被調(diào)用, i=', i, ’v =’, v)self.data[i] = v # 修改data綁定的列表L1 = MyList([1, -2, 3, -4])v = L1[-1]print(v)L1[1] = 2 # 等同于調(diào)用 L1.__setitem__(1, 2)print(L1)# 以下操作會出錯# print(L1[100000000000])# print(L1[’hello’])十三、slice 構(gòu)造函數(shù)

作用:用于創(chuàng)建一個Slice切片對象, 此對象存儲一個切片的起始值,終止值和步長信息

slice(start, stop=None, step=None) 創(chuàng)建一個切片對象

slice的對象的屬性:

s.start 切片起始值,默認為None s.stop 切片終止值,默認為None s.step 切片步長 ,默認為None

class MyList: def __init__(self, iterable):print('__init__被調(diào)用')self.data = list(iterable) def __repr__(self):return ’MyList(%r)’ % self.data def __getitem__(self, i):print('__getitem__被調(diào)用, i=', i)if type(i) is int: print('正在做索引操作')elif type(i) is slice: print('正在做切片操作') print('切片的起始值:', i.start) print('切片的終止值:', i.stop) print('切片的步長:', i.step)else: raise KeyErrorreturn self.data[i]L1 = MyList([1, -2, 3, -4, 5, -6])print(L1[::2]) # 等同于調(diào)用L1[slice(None, None, 2)]

以上就是解析python高級異常和運算符重載的詳細內(nèi)容,更多關(guān)于python 高級異常 運算符重載的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 液压升降货梯_导轨式升降货梯厂家_升降货梯厂家-河南东圣升降设备有限公司 | TTCMS自助建站_网站建设_自助建站_免费网站_免费建站_天天向上旗下品牌 | 江苏南京多语种翻译-专业翻译公司报价-正规商务翻译机构-南京华彦翻译服务有限公司 | 爱德华真空泵油/罗茨泵维修,爱发科-比其尔产品供应东莞/杭州/上海等全国各地 | 电磁辐射仪-电磁辐射检测仪-pm2.5检测仪-多功能射线检测仪-上海何亦仪器仪表有限公司 | 雷蒙磨,雷蒙磨粉机,雷蒙磨机 - 巩义市大峪沟高峰机械厂 | 鄂泉泵业官网|(杭州、上海、全国畅销)大流量防汛排涝泵-LW立式排污泵 | 真空包装机-诸城市坤泰食品机械有限公司 | RFID电子标签厂家-上海尼太普电子有限公司 | 变色龙云 - 打包app_原生app_在线制作平台_短链接_ip查询 | 花纹铝板,合金铝卷板,阴极铝板-济南恒诚铝业有限公司 | Trimos测长机_测高仪_TESA_mahr,WYLER水平仪,PWB对刀仪-德瑞华测量技术(苏州)有限公司 | 济南冷库安装-山东冷库设计|建造|冷库维修-山东齐雪制冷设备有限公司 | 对照品_中药对照品_标准品_对照药材_「格利普」高纯中药标准品厂家-成都格利普生物科技有限公司 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库 | 吊篮式|移动式冷热冲击试验箱-二槽冷热冲击试验箱-广东科宝 | 深圳市东信高科自动化设备有限公司| 智能化的检漏仪_气密性测试仪_流量测试仪_流阻阻力测试仪_呼吸管快速检漏仪_连接器防水测试仪_车载镜头测试仪_奥图自动化科技 | 短信营销平台_短信群发平台_106短信发送平台-河南路尚 | 软文世界-软文推广-软文营销-新闻稿发布-一站式软文自助发稿平台 | 超声波破碎仪-均质乳化机(供应杭州,上海,北京,广州,深圳,成都等地)-上海沪析实业有限公司 | 拼装地板,悬浮地板厂家,悬浮式拼装运动地板-石家庄博超地板科技有限公司 | 储气罐,真空罐,缓冲罐,隔膜气压罐厂家批发价格,空压机储气罐规格型号-上海申容压力容器集团有限公司 | 防水套管厂家-柔性防水套管-不锈钢|刚性防水套管-天翔管道 | 螺旋丝杆升降机-SWL蜗轮-滚珠丝杆升降机厂家-山东明泰传动机械有限公司 | 工业废水处理|污水处理厂|废水治理设备工程技术公司-苏州瑞美迪 今日娱乐圈——影视剧集_八卦娱乐_明星八卦_最新娱乐八卦新闻 | 细砂提取机,隔膜板框泥浆污泥压滤机,螺旋洗砂机设备,轮式洗砂机械,机制砂,圆锥颚式反击式破碎机,振动筛,滚筒筛,喂料机- 上海重睿环保设备有限公司 | 消电检公司,消电检价格,北京消电检报告-北京设施检测公司-亿杰(北京)消防工程有限公司 | 门禁卡_智能IC卡_滴胶卡制作_硅胶腕带-卡立方rfid定制厂家 | 耐酸碱胶管_耐腐蚀软管总成_化学品输送软管_漯河利通液压科技耐油耐磨喷砂软管|耐腐蚀化学软管 | 云杂志网-学术期刊-首页 | AGV无人叉车_激光叉车AGV_仓储AGV小车_AGV无人搬运车-南昌IKV机器人有限公司[官网] | 佛山市钱丰金属不锈钢蜂窝板定制厂家|不锈钢装饰线条|不锈钢屏风| 电梯装饰板|不锈钢蜂窝板不锈钢工艺板材厂家佛山市钱丰金属制品有限公司 | ★塑料拖链__工程拖链__电缆拖链__钢制拖链 - 【上海闵彬】 | 塑料撕碎机_编织袋撕碎机_废纸撕碎机_生活垃圾撕碎机_废铁破碎机_河南鑫世昌机械制造有限公司 | 喷涂流水线,涂装流水线,喷漆流水线-山东天意设备科技有限公司 | 量子管通环-自清洗过滤器-全自动反冲洗过滤器-北京罗伦过滤技术集团有限公司 | 潍坊大集网-潍坊信息港-潍坊信息网 | 【德信自动化】点胶机_全自动点胶机_自动点胶机厂家_塑料热压机_自动螺丝机-深圳市德信自动化设备有限公司 | 并离网逆变器_高频UPS电源定制_户用储能光伏逆变器厂家-深圳市索克新能源 | 成都顶呱呱信息技术有限公司-贷款_个人贷款_银行贷款在线申请 - 成都贷款公司 | 衡阳耐适防护科技有限公司——威仕盾焊接防护用品官网/焊工手套/焊接防护服/皮革防护手套 |