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

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

Python元類(lèi)與迭代器生成器案例詳解

瀏覽:12日期:2022-08-07 08:16:13
1.__getattr__和__getattribute__魔法函數(shù)

__getattr__是當(dāng)類(lèi)調(diào)用一個(gè)不存在的屬性時(shí)才會(huì)調(diào)用getattr魔法函數(shù),他傳入的值item就是你這個(gè)調(diào)用的不存在的值。__getattribute__則是無(wú)條件的優(yōu)先執(zhí)行,所以如果不是特殊情況最好不要用__getattribute__。

class User(object): def __init__(self, name, info):self.name = nameself.info = info def __getattr__(self, item):return self.info[item]ls = User('李四',{'gender':'male'})print(ls.gender) 2.屬性描述符

屬性描述符介紹屬性描述符是一個(gè)強(qiáng)大的通用協(xié)議。它是properties, methods, static methods, class methods 和super()的調(diào)用原理。

屬性描述符協(xié)議屬性描述符是實(shí)現(xiàn)了特定協(xié)議的類(lèi),只要實(shí)現(xiàn)了__get__,__set__和__delete__三個(gè)方法中的任意一個(gè),這個(gè)類(lèi)就是描述符,它能實(shí)現(xiàn)對(duì)多個(gè)屬性運(yùn)用相同存取邏輯的一種方式,通俗來(lái)說(shuō)就是:創(chuàng)建一個(gè)實(shí)例,作為另一個(gè)類(lèi)的類(lèi)屬性。

注意

• 如果一個(gè)對(duì)象同時(shí)定義了__get__和__set__方法,它被稱(chēng)做數(shù)據(jù)描述符(data descriptor)。

• 只定義__get__方法的對(duì)象則被稱(chēng)為非數(shù)據(jù)描述符(non-data descriptor)。

使用類(lèi)方法創(chuàng)建描述符

• 定義一個(gè)IntField類(lèi)為描述符類(lèi)

• 創(chuàng)建IntField類(lèi)的實(shí)例,作為另一個(gè)User類(lèi)的屬性

class IntField(object): def __set__(self, instance, value):print('__set__') def __get__(self, instance, owner):print('__get__') def __delete__(self, instance):print('__delete__')class User(object): age = IntField()ls = User()ls.age ls.age = 30 del ls.age

使用屬性類(lèi)型創(chuàng)建描述符

除了使用類(lèi)當(dāng)作一個(gè)屬性描述符,我們之前學(xué)習(xí)的 property(),就是可以輕松地為任意屬性創(chuàng)建可用的描述符。創(chuàng)建 property() 的語(yǔ)法是 property(fget=None, fset=None, fdel=None, doc=None)

描述符查找順序

• 當(dāng)為數(shù)據(jù)描述符時(shí), __get__優(yōu)先級(jí)高于__dict__• 當(dāng)為非數(shù)據(jù)描述符時(shí),__dict__優(yōu)先級(jí)高于__get__

元類(lèi)

元類(lèi)介紹

元類(lèi)實(shí)際上就是創(chuàng)建類(lèi)的類(lèi)

實(shí)現(xiàn)如下:

• 定義創(chuàng)建類(lèi)的函數(shù)create_class• 如果給create_class傳的參數(shù)為user,則創(chuàng)建User類(lèi)

type()創(chuàng)建元類(lèi)

• 第一個(gè)參數(shù):name表示類(lèi)名稱(chēng),字符串類(lèi)型• 第二個(gè)參數(shù):bases表示繼承對(duì)象(父類(lèi)),元組類(lèi)型,單元素使用逗號(hào)• 第三個(gè)參數(shù):attr表示屬性,這里可以填寫(xiě)類(lèi)屬性、類(lèi)方式、靜態(tài)方法,采用字典格式,key為屬性名,value為屬性值

def __init__(self, name): self.name = name print('i am __init__')User = type('User', (), {'age':18 , '__init__':__init__})obj = User('amy') print(obj.name)

metaclass屬性

如果一個(gè)類(lèi)中定義了__metalass__ = xxx,Python就會(huì)用元類(lèi)的方式來(lái)創(chuàng)建類(lèi),就可以控制類(lèi)的創(chuàng)建行為比如,以下代碼,再不改變類(lèi)屬性的抒寫(xiě)情況下,將屬性名規(guī)定為大寫(xiě)訪問(wèn)。

class MyClass(object): name = 'ls'mc = MyClass()print(mc.name)Python迭代器

迭代器指的是迭代取值的工具,迭代是指一個(gè)重復(fù)的過(guò)程,每一次重復(fù)都是基于上一次結(jié)果而來(lái)迭代提供了一種通用的不依賴(lài)索引的迭代取值方式

可迭代對(duì)象

可以用for循環(huán)遍歷的對(duì)象都是可迭代對(duì)象。• str,list,tuple,dict,set等都是可迭代對(duì)象。• generator,包括生成器和帶yield的生成器函數(shù)。

判斷是否可迭代

除了看內(nèi)置是否含有__iter__方法來(lái)判斷該對(duì)象是否是一個(gè)可迭代的對(duì)象之外,我們還可以使用 isinstance() 判斷一個(gè)對(duì)象是否是 Iterable 對(duì)象• isinstance()–>用來(lái)判斷對(duì)象是否是相應(yīng)類(lèi)型,與type()類(lèi)似。

from collections import Iterable,Iteratorprint(isinstance(’abc’,Iterable)) # Trueprint(isinstance([1,2,3,4],Iterable)) # Trueprint(isinstance(123,Iterable)) # False

迭代器對(duì)象

• 有內(nèi)置的__next__()方法的對(duì)象,執(zhí)行該方法可以不依賴(lài)索引取值• 有內(nèi)置的__iter__()方法的對(duì)象,執(zhí)行迭代器的__iter__()方法得到的依然是迭代器本身需要注意的是,可迭代對(duì)象不一定是迭代器

iter()

可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象稱(chēng)為迭代器:Iterator。那我們可以通過(guò)iter()方法將可迭代的對(duì)象,轉(zhuǎn)為迭代器。

li = [1,2,3,4]lis = iter(li)print(type(lis)) # <class ’list_iterator’>

注意:• 迭代器不可以通過(guò)下標(biāo)取值,而是使用__next__()或者next()。但是只要超出范圍則直接報(bào)錯(cuò)StopIteration。

print(lis[0]) # 報(bào)錯(cuò) not subscriptableprint(lis.__next__())print(lis.__next__())print(lis.__next__())print(lis.__next__())print(next(lis))print(next(lis))print(next(lis))print(next(lis))

• next()只能順延調(diào)用,不能往前。

可迭代對(duì)象與迭代器區(qū)別• 可用于for循環(huán)的都是可迭代類(lèi)型• 作用于next()都是迭代器類(lèi)型• list、dict、str等都是可迭代的但不是迭代器,因?yàn)閚ext()函數(shù)無(wú)法調(diào)用它們。可以通過(guò)iter()函數(shù)將它們轉(zhuǎn)為迭代器• python的for循環(huán)本質(zhì)就是通過(guò)不斷調(diào)用next()函數(shù)實(shí)現(xiàn)的

生成器

生成器定義在Python中,一邊循環(huán)一邊計(jì)算的機(jī)制,稱(chēng)為生成器:generator。為什么要有生成器列表所有數(shù)據(jù)都在內(nèi)存中,如果有海量數(shù)據(jù)的話(huà)會(huì)非常消耗內(nèi)存。比如說(shuō):我們僅僅需要訪問(wèn)前面幾個(gè)元素,但后面絕大多元素占用的內(nèi)存就會(huì)浪費(fèi)了。那么生成器就是在循環(huán)的過(guò)程中根據(jù)算法不斷推算出后續(xù)的元素,這樣就不用創(chuàng)建整個(gè)完整的列表,從而節(jié)省大量的空間。總而言之,就是當(dāng)我們想要使用龐大數(shù)據(jù),又想讓它占用的空間少,那就使用生成器。

如何創(chuàng)建生成器

生成器表達(dá)式生成器表達(dá)式來(lái)源于迭代和列表解析的組合,生成器和列表解析類(lèi)似,但是它使用()而不是[]。

g = (x for x in range(5))print(g) # generator objectprint(next(g))print(next(g))print(next(g))print(next(g))print(next(g))# 超出報(bào)錯(cuò)print(next(g))for i in g: print(i)

生成器函數(shù)當(dāng)一個(gè)函數(shù)中包含yield關(guān)鍵字,那么這個(gè)函數(shù)就不再是一個(gè)普通的函數(shù),而是一個(gè)generator。調(diào)用函數(shù)就是創(chuàng)建了一個(gè)生成器對(duì)象。其工作原理就是通過(guò)重復(fù)調(diào)用next()或者_(dá)_next__()方法,直到捕獲一個(gè)異常。比如:實(shí)現(xiàn)斐波那契數(shù)列,除第一個(gè)和第二個(gè)數(shù)外,任何一個(gè)數(shù)都可以由前兩個(gè)相加得到:1,1,2,3,5,8,12,21,34…

def createNums(): print('-----func start-----') a,b = 0,1 for i in range(5):# print(b)print('--1--')yield bprint('--2--')a,b = b,a+bprint('--3--') print('-----func end-----') g = createNums()print(next(g)) print(next(g)) print(next(g))print(next(g))print(next(g))

注意:

• yield返回一個(gè)值,并且記住這個(gè)返回值的位置,下次遇到next()調(diào)用時(shí),代碼從yield的下一條語(yǔ)句開(kāi)始執(zhí)行。與return的差別是,return也是返回一個(gè)值,但是直接結(jié)束函數(shù)。

迭代器與生成器

• 生成器能做到迭代器能做的所有事

• 而且因?yàn)樯善髯詣?dòng)創(chuàng)建了iter()和next()方法,生成器顯得簡(jiǎn)潔,而且高效。

讀取大文件

文件300G,文件比較特殊,一行 分隔符 {|}

def readlines(f,newline): buf = '' while True:while newline in buf: pos = buf.index(newline) yield buf[:pos] buf = buf[pos + len(newline):]chunk = f.read(4096*10)if not chunk: yield buf breakbuf += chunkwith open(’demo.txt’) as f: for line in readlines(f,'{|}'):print(line)

到此這篇關(guān)于Python元類(lèi)與迭代器生成器案例詳解的文章就介紹到這了,更多相關(guān)Python元類(lèi)與迭代器生成器內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: LED灯杆屏_LED广告机_户外LED广告机_智慧灯杆_智慧路灯-太龙智显科技(深圳)有限公司 | CCE素质教育博览会 | CCE素博会 | 教育展 | 美育展 | 科教展 | 素质教育展 | 澳威全屋定制官网|极简衣柜十大品牌|衣柜加盟代理|全屋定制招商 百度爱采购运营研究社社群-店铺托管-爱采购代运营-良言多米网络公司 | Trimos测长机_测高仪_TESA_mahr,WYLER水平仪,PWB对刀仪-德瑞华测量技术(苏州)有限公司 | 北京模型公司-工业模型-地产模型-施工模型-北京渝峰时代沙盘模型制作公司 | 超声波流量计_流量标准装置生产厂家 _河南盛天精密测控 | 湖南专升本-湖南省专升本报名-湖南统招专升本考试网 | 微水泥_硅藻泥_艺术涂料_艺术漆_艺术漆加盟-青岛泥之韵环保壁材 武汉EPS线条_EPS装饰线条_EPS构件_湖北博欧EPS线条厂家 | 钢衬四氟管道_钢衬四氟直管_聚四氟乙烯衬里管件_聚四氟乙烯衬里管道-沧州汇霖管道科技有限公司 | 气动调节阀,电动调节阀,自力式压力调节阀,切断阀「厂家」-浙江利沃夫自控阀门 | 工业淬火油烟净化器,北京油烟净化器厂家,热处理油烟净化器-北京众鑫百科 | 移动厕所租赁|移动卫生间|上海移动厕所租赁-家瑞租赁 | 气动隔膜泵-电动隔膜泵-循环热水泵-液下排污/螺杆/管道/化工泵「厂家」浙江绿邦 | 真空上料机(一种真空输送机)-百科| 净气型药品柜-试剂柜-无管道净气型通风柜-苏州毕恩思 | Maneurop/美优乐压缩机,活塞压缩机,型号规格,技术参数,尺寸图片,价格经销商 | 山东氧化铁红,山东铁红-淄博科瑞化工有限公司 | 找果网 | 苹果手机找回方法,苹果iPhone手机丢了找回,认准找果网! | 【中联邦】增稠剂_增稠粉_水性增稠剂_涂料增稠剂_工业增稠剂生产厂家 | 浙江红酒库-冰雕库-气调库-茶叶库安装-医药疫苗冷库-食品物流恒温恒湿车间-杭州领顺实业有限公司 | 天津中都白癜风医院_天津白癜风医院_天津治疗白癜风 | 银川美容培训-美睫美甲培训-彩妆纹绣培训-新娘化妆-学化妆-宁夏倍莱妮职业技能培训学校有限公司 临时厕所租赁_玻璃钢厕所租赁_蹲式|坐式厕所出租-北京慧海通 | 中国品牌门窗网_中国十大门窗品牌_著名门窗品牌| 金属波纹补偿器厂家_不锈钢膨胀节价格_非金属伸缩节定制-庆达补偿器 | 地磅-电子地磅维修-电子吊秤-汽车衡-无人值守系统-公路治超-鹰牌衡器 | 双工位钻铣攻牙机-转换工作台钻攻中心-钻铣攻牙机一体机-浙江利硕自动化设备有限公司 | 首页|专注深圳注册公司,代理记账报税,注册商标代理,工商变更,企业400电话等企业一站式服务-慧用心 | 不锈钢螺丝,不锈钢螺栓,不锈钢标准件-江苏百德特种合金有限公司 交变/复合盐雾试验箱-高低温冲击试验箱_安奈设备产品供应杭州/江苏南京/安徽马鞍山合肥等全国各地 | 柔软云母板-硬质-水位计云母片组件-首页-武汉长丰云母绝缘材料有限公司 | 硬度计_影像测量仪_维氏硬度计_佛山市精测计量仪器设备有限公司厂家 | 防火窗_耐火窗_防火门厂家_防火卷帘门-重庆三乐门业有限公司 | 粒米特测控技术(上海)有限公司-测功机_减速机测试台_电机测试台 | 牛皮纸|牛卡纸|进口牛皮纸|食品级牛皮纸|牛皮纸厂家-伽立实业 | 北京租车公司_汽车/客车/班车/大巴车租赁_商务会议/展会用车/旅游大巴出租_北京桐顺创业租车公司 | 量子管通环-自清洗过滤器-全自动反冲洗过滤器-北京罗伦过滤技术集团有限公司 | 德州万泰装饰 - 万泰装饰装修设计软装家居馆 | 精密模具制造,注塑加工,吹塑和吹瓶加工,EPS泡沫包装生产 - 济南兴田塑胶有限公司 | 上海刑事律师|刑事辩护律师|专业刑事犯罪辩护律师免费咨询-[尤辰荣]金牌上海刑事律师团队 | 衬四氟_衬氟储罐_四氟储罐-无锡市氟瑞特防腐科技有限公司 | 微波消解仪器_智能微波消解仪报价_高压微波消解仪厂家_那艾 | 运动木地板_体育木地板_篮球馆木地板_舞台木地板-实木运动地板厂家 |