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

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:8日期:2022-08-07 08:16:13
1.__getattr__和__getattribute__魔法函數

__getattr__是當類調用一個不存在的屬性時才會調用getattr魔法函數,他傳入的值item就是你這個調用的不存在的值。__getattribute__則是無條件的優先執行,所以如果不是特殊情況最好不要用__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.屬性描述符

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

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

注意

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

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

使用類方法創建描述符

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

• 創建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

使用屬性類型創建描述符

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

描述符查找順序

• 當為數據描述符時, __get__優先級高于__dict__• 當為非數據描述符時,__dict__優先級高于__get__

元類

元類介紹

元類實際上就是創建類的類

實現如下:

• 定義創建類的函數create_class• 如果給create_class傳的參數為user,則創建User類

type()創建元類

• 第一個參數:name表示類名稱,字符串類型• 第二個參數:bases表示繼承對象(父類),元組類型,單元素使用逗號• 第三個參數:attr表示屬性,這里可以填寫類屬性、類方式、靜態方法,采用字典格式,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就會用元類的方式來創建類,就可以控制類的創建行為比如,以下代碼,再不改變類屬性的抒寫情況下,將屬性名規定為大寫訪問。

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

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

可迭代對象

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

判斷是否可迭代

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

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

迭代器對象

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

iter()

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

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

注意:• 迭代器不可以通過下標取值,而是使用__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()只能順延調用,不能往前。

可迭代對象與迭代器區別• 可用于for循環的都是可迭代類型• 作用于next()都是迭代器類型• list、dict、str等都是可迭代的但不是迭代器,因為next()函數無法調用它們。可以通過iter()函數將它們轉為迭代器• python的for循環本質就是通過不斷調用next()函數實現的

生成器

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

如何創建生成器

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

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)

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

迭代器與生成器

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

• 而且因為生成器自動創建了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)

到此這篇關于Python元類與迭代器生成器案例詳解的文章就介紹到這了,更多相關Python元類與迭代器生成器內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产情侣久久| 色婷婷色综合| 国产精品久久久久久av公交车| 日韩精品不卡一区二区| 亚洲精品韩国| 国精品一区二区三区| 国内在线观看一区二区三区| 男人的天堂久久精品| 香蕉视频亚洲一级| 综合视频一区| 久久国产福利| 国产精品视频一区二区三区四蜜臂 | 久久久久久久久久久妇女| 日韩av一区二区在线影视| 99国产精品久久久久久久成人热| 国产精品毛片久久| 欧美国产日韩电影| 日本亚洲视频| 1024精品久久久久久久久| 国产福利亚洲| 欧美午夜网站| 国产欧美日韩免费观看| 97精品资源在线观看| 国产日韩欧美一区二区三区在线观看| 天堂成人免费av电影一区 | 久久久久久色| 亚洲在线久久| 亚洲精品美女91| 91精品一区| 欧美交a欧美精品喷水| 久久精品国产99国产精品| 丁香六月综合| 午夜精品婷婷| 99热精品在线| 视频一区视频二区中文| 蜜臀久久久久久久| 综合日韩av| 久久婷婷亚洲| 高清在线一区| 欧美日韩91| 久久夜夜操妹子| 亲子伦视频一区二区三区| 一区二区精品伦理...| 日韩国产欧美一区二区| 亚洲播播91| 午夜亚洲一区| 国产精品调教视频| 久久亚洲专区| 吉吉日韩欧美| 国产精品试看| 久久精品理论片| 午夜欧美精品| 国产精品免费大片| 亚洲天堂久久| 国产精品久久久久久久久久齐齐| 精品国产免费人成网站| 免费在线视频一区| 精品亚洲a∨| 玖玖精品视频| 久久男人av资源站| 日本va欧美va精品发布| 久久久久99| 欧美日韩精品一区二区三区视频| 国产精品密蕾丝视频下载| 国产综合欧美| 国产精品密蕾丝视频下载| 成人在线黄色| 日本在线高清| 136国产福利精品导航网址| 久久精品99国产精品| 免费一区二区视频| 欧美日韩精品免费观看视欧美高清免费大片 | 精品美女在线视频| 日本成人在线不卡视频| 久久伦理在线| 日韩三级一区| 久久精选视频| 日本午夜精品一区二区三区电影| 麻豆成人91精品二区三区| 久久男人av资源站| 午夜在线播放视频欧美| 日韩av一区二区三区四区| 国产精品久久久亚洲一区| 亚洲一区二区三区四区电影| 国精品产品一区| 亚洲精品一区二区在线播放∴| 国产成人精品一区二区三区视频 | 久久中文在线| 亚洲青青久久| 午夜精品网站| 国产自产自拍视频在线观看| 国产精品免费99久久久| 日本一不卡视频| 欧美日韩一区二区综合| 麻豆精品在线观看| 日韩一区二区三区精品| 欧美日韩国产免费观看视频| 色婷婷色综合| 精品一区二区三区中文字幕视频| 亚洲精品国产日韩| 亚洲网站视频| 欧美二三四区| 欧美激情另类| 国产一区二区精品久| 国产精品99精品一区二区三区∴ | 韩国女主播一区二区三区| 亚洲综合二区| 久久久久久久欧美精品| 欧美va天堂在线| 国产精品久久久久久模特| 国产一区福利| 欧美日韩视频网站| 久久国产精品久久w女人spa| 日韩在线二区| 国产精品亚洲综合久久| 欧美专区18| 久久香蕉国产| 99精品美女| 中文字幕日韩亚洲| 黄页网站一区| 国产一区二区三区国产精品 | www在线观看黄色| 久久久蜜桃一区二区人| 国产精品普通话对白| 精品视频在线观看网站| 久久激五月天综合精品| 今天的高清视频免费播放成人| 国产精品亚洲二区| 国产精品红桃| 日韩黄色在线观看| 国产精品13p| 国产精品chinese| 中文字幕一区二区三区日韩精品 | 久久精品国产免费| 另类欧美日韩国产在线| 欧美日韩网址| 国产精品xxx在线观看| 国产乱码精品一区二区三区四区| 久久国产99| 亚洲精一区二区三区| 亚洲日产国产精品| 日本午夜精品久久久| 欧美自拍一区| 久久一区视频| 裤袜国产欧美精品一区| 老司机免费视频一区二区| 狠狠久久伊人中文字幕| 精品网站aaa| 久久电影tv| 亚洲大片在线| 亚洲视频国产精品| 国产美女视频一区二区| 美女国产一区二区三区| 久久影视三级福利片| 成人在线免费观看网站| 久久九九电影| 亚洲一区网站| 亚洲影院天堂中文av色| 国产精品手机在线播放| 久久不见久久见免费视频7| 日本91福利区| 鲁大师影院一区二区三区| 日韩激情一区| 激情婷婷久久| 中日韩男男gay无套| 日韩国产精品久久久| 精品久久精品| 午夜av一区| 亚洲午夜久久| 国产精品v亚洲精品v日韩精品| 天堂8中文在线最新版在线| 在线亚洲欧美| 国产精品黄色片| 亚洲h色精品| 91综合久久爱com| 日韩在线看片| 日韩三级视频| 亚洲黄色网址| 免费在线观看日韩欧美| 精品久久久网| 国产精品日本欧美一区二区三区| 国产日韩一区二区三免费高清 | 久久久亚洲一区| 色8久久久久| 鲁鲁在线中文| 视频一区中文字幕精品| 成人三级高清视频在线看| 六月婷婷一区| 国产精品99一区二区三| 香蕉精品999视频一区二区| 国产视频一区二区在线播放| 国产资源在线观看入口av| 中文字幕av一区二区三区人| 国产一区二区三区四区五区传媒| 三级在线观看一区二区 | 国产欧美日韩综合一区在线播放| 婷婷成人在线| 91精品日本| 欧美日韩四区| 久久精品国产在热久久|