日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

Python元類與迭代器生成器案例詳解

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

__getattr__是當(dāng)類調(diào)用一個不存在的屬性時才會調(diào)用getattr魔法函數(shù),他傳入的值item就是你這個調(diào)用的不存在的值。__getattribute__則是無條件的優(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.屬性描述符

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

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

注意

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

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

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

• 定義一個IntField類為描述符類

• 創(chuàng)建IntField類的實例,作為另一個User類的屬性

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

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

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

描述符查找順序

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

元類

元類介紹

元類實際上就是創(chuàng)建類的類

實現(xiàn)如下:

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

type()創(chuàng)建元類

• 第一個參數(shù):name表示類名稱,字符串類型• 第二個參數(shù):bases表示繼承對象(父類),元組類型,單元素使用逗號• 第三個參數(shù):attr表示屬性,這里可以填寫類屬性、類方式、靜態(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屬性

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

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

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

可迭代對象

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

判斷是否可迭代

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

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

迭代器對象

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

iter()

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

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

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

print(lis[0]) # 報錯 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)用,不能往前。

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

生成器

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

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

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

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))# 超出報錯print(next(g))for i in g: print(i)

生成器函數(shù)當(dāng)一個函數(shù)中包含yield關(guān)鍵字,那么這個函數(shù)就不再是一個普通的函數(shù),而是一個generator。調(diào)用函數(shù)就是創(chuàng)建了一個生成器對象。其工作原理就是通過重復(fù)調(diào)用next()或者__next__()方法,直到捕獲一個異常。比如:實現(xiàn)斐波那契數(shù)列,除第一個和第二個數(shù)外,任何一個數(shù)都可以由前兩個相加得到: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返回一個值,并且記住這個返回值的位置,下次遇到next()調(diào)用時,代碼從yield的下一條語句開始執(zhí)行。與return的差別是,return也是返回一個值,但是直接結(jié)束函數(shù)。

迭代器與生成器

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

• 而且因為生成器自動創(chuàng)建了iter()和next()方法,生成器顯得簡潔,而且高效。

讀取大文件

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

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
激情六月综合| 视频在线在亚洲| 久久久久99| 日韩av不卡在线观看| 日韩成人高清| 亚洲久久一区| а√天堂8资源在线| 中文一区二区| 国产精品国产三级国产在线观看| 激情久久久久久| 国产精品一级| 欧美freesex黑人又粗又大| 国产精品丝袜xxxxxxx| 国产精品xvideos88| 18国产精品| 日韩国产欧美一区二区三区| 亚洲三级精品| 日本不卡中文字幕| 日韩av资源网| 日本一区二区高清不卡| 久久wwww| 麻豆久久一区二区| 欧美激情91| 精品免费视频| 国产成人久久精品一区二区三区| 97精品视频在线看| 亚洲h色精品| 9色精品在线| 日本中文字幕一区二区视频 | 精品不卡一区| 伊人成人网在线看| 精品丝袜久久| 亚洲激情av| 日本一区二区三区视频在线看 | 免费一级欧美片在线观看网站| 吉吉日韩欧美| 免费毛片在线不卡| 中文字幕一区二区精品区| 国产精品久久久一区二区| 欧美韩日一区| 亚洲在线一区| 亚洲三级精品| 久久精品天堂| 99国产精品99久久久久久粉嫩| 久久成人国产| 麻豆久久久久久久| 亚洲一级在线| 精品久久中文| 亚洲精品女人| 91亚洲国产成人久久精品| 免费视频国产一区| 老鸭窝一区二区久久精品| 首页欧美精品中文字幕| 国产成人免费| 国产精品a级| 久久亚洲二区| 国产精品v日韩精品v欧美精品网站 | 蜜桃视频免费观看一区| 欧美一级一区| 亚洲精品国产偷自在线观看| 久久国产尿小便嘘嘘| 日韩精品视频在线看| 欧美国产美女| 精品九九久久| 国产精品高潮呻吟久久久久| 9色国产精品| 91九色精品| 国产乱码精品一区二区三区亚洲人| 一区二区视频欧美| 欧美日韩国产高清电影| 99成人在线视频| 亚洲啊v在线| 久久久一本精品| 日韩免费在线| 国产一区视频在线观看免费| 免费在线欧美视频| 色在线视频观看| 国产精品一线天粉嫩av| 亚洲综合三区| 免费观看久久av| 日韩欧美少妇| 欧美精品导航| 天堂av在线一区| 婷婷中文字幕一区| 国产在线看片免费视频在线观看| 国产乱码精品一区二区三区亚洲人| 亚洲精品动态| 日韩精品视频网站| 欧美在线日韩| 欧美国产不卡| 久久99蜜桃| 不卡专区在线| 欧美精品日日操| 99精品网站| 午夜欧美精品| 欧美日韩精品一本二本三本| 麻豆国产欧美日韩综合精品二区| 亚洲天堂免费| 亚洲精品护士| 久久精品青草| 欧美日韩一二三四| 亚洲深爱激情| 日韩久久一区| 国产精品天堂蜜av在线播放| 久久亚洲资源中文字| www.51av欧美视频| 午夜精品一区二区三区国产| 久久xxxx精品视频| 国产精品久久久网站| 三级在线看中文字幕完整版| 91超碰国产精品| 日韩国产精品久久久久久亚洲| 久久都是精品| 国产精品尤物| 婷婷精品进入| 国产精品色在线网站| 97精品国产福利一区二区三区| 亚洲一级影院| 免费观看不卡av| 久久一区欧美| 国产精品a级| 国产美女视频一区二区| 四虎在线精品| 中文无码日韩欧| 中文字幕视频精品一区二区三区| 国产精品外国| 久久不射网站| 尹人成人综合网| 五月精品视频| 亚洲综合精品| 蜜桃av一区二区三区电影| 另类av一区二区| 石原莉奈在线亚洲二区| 国产精品美女| 午夜电影一区| 欧美日韩网址| 麻豆精品在线观看| 久久免费精品| 精品亚洲美女网站| 欧美影院三区| 久久精品国产99国产精品| 国产a亚洲精品| 国产盗摄——sm在线视频| 国产videos久久| 久久精品影视| 香蕉久久国产| 免费日韩成人| 青青久久av| 亚洲精品高潮| 你懂的国产精品| 久久久国产精品一区二区中文| 亚洲成人精选| 国产精品一页| 国产在线不卡| 国产精品伦一区二区| 久久精品国内一区二区三区水蜜桃| 国产韩日影视精品| 日韩精品一级| 国产精品不卡| 亚洲精品一级| 色综合www| 日韩黄色av| 国产99精品| 日韩中文av| 美女久久久久| 国产一区福利| 亚洲三级毛片| 神马日本精品| 日本欧美大码aⅴ在线播放| 国产传媒在线观看| 日本色综合中文字幕| 亚洲高清不卡| 美女视频网站久久| 99综合视频| 欧美片第1页| 国产精品伊人| 免费看日韩精品| 蜜桃一区二区三区| 国产不卡一区| 欧美日韩精品一区二区三区在线观看| 九九综合在线| 另类中文字幕国产精品| 欧美精品成人| 国产精品成人3p一区二区三区| 免费久久99精品国产| 另类中文字幕国产精品| 麻豆国产精品视频| 国产欧美日韩免费观看| 免费人成精品欧美精品| 亚洲小说欧美另类婷婷| 日韩综合在线| 激情久久一区二区| 国产欧美日韩在线观看视频| 亚洲精品无吗| 亚洲1区在线观看| 亚洲丝袜美腿一区| 免费在线观看一区二区三区| 久久国产精品久久w女人spa| 久久精品国产大片免费观看| 日韩中文欧美|