婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Python元類與迭代器生成器案例詳解

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

熱門標簽:地圖標注多個 鶴壁手機自動外呼系統違法嗎 B52系統電梯外呼顯示E7 銀川電話機器人電話 高德地圖標注收入咋樣 企業微信地圖標注 怎么辦理400客服電話 萊蕪電信外呼系統 沈陽防封電銷電話卡

1.__getattr__和__getattribute__魔法函數

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

class User(object):
    def __init__(self, name, info):
        self.name = name
        self.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,Iterator
print(isinstance('abc',Iterable))   # True
print(isinstance([1,2,3,4],Iterable))   # True
print(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 subscriptable
print(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 object
print(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 b
        print("--2--")
        a,b = b,a+b
        print("--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
            break
        buf += chunk
with open('demo.txt') as f:
    for line in readlines(f,"{|}"):
        print(line)

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

您可能感興趣的文章:
  • Python基礎之元編程知識總結
  • Python中用Decorator來簡化元編程的教程
  • Python中使用裝飾器和元編程實現結構體類實例
  • 簡析Python函數式編程字符串和元組及函數分類與高階函數
  • python使用xpath獲取頁面元素的使用
  • 如何利用Python批量處理行、列和單元格詳解
  • Python BeautifulSoup基本用法詳解(通過標簽及class定位元素)
  • python中使用 unittest.TestCase單元測試的用例詳解
  • Python接口自動化淺析unittest單元測試原理
  • python自動化八大定位元素講解
  • python一繪制元二次方程曲線的實例分析
  • 詳解Python自動化中這八大元素定位
  • python元組打包和解包過程詳解
  • 淺談Python的元編程

標簽:銀川 烏魯木齊 呼倫貝爾 湘西 安慶 呼倫貝爾 三亞 葫蘆島

巨人網絡通訊聲明:本文標題《Python元類與迭代器生成器案例詳解》,本文關鍵詞  Python,元類,與,迭代,器生,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Python元類與迭代器生成器案例詳解》相關的同類信息!
  • 本頁收集關于Python元類與迭代器生成器案例詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美日韩成人综合在线一区二区| 国产成人亚洲综合a∨婷婷| 亚洲国产日韩一级| 成人av网站在线| 中文幕一区二区三区久久蜜桃| 国产露脸91国语对白| 国产日韩精品久久久| 国产一区二区视频在线播放| 精品女同一区二区| 国产精品911| 亚洲三级在线播放| 欧美午夜精品免费| 亚洲高清在线精品| 91麻豆精品国产91久久久久久久久| 天堂影院一区二区| 日韩欧美国产电影| 国产91在线|亚洲| 1区2区3区欧美| 欧美综合一区二区| 美女视频免费一区| 久久精品综合网| 91在线免费播放| 丝袜诱惑制服诱惑色一区在线观看| 欧美一区二区三区免费视频| 麻豆精品蜜桃视频网站| 欧美国产一区二区在线观看 | 欧美激情在线观看视频免费| 国产成人精品www牛牛影视| 久久久综合激的五月天| 日韩avvvv在线播放| 日韩午夜在线观看| 99精品热视频| 亚洲午夜久久久久久久久电影网 | 99麻豆久久久国产精品免费优播| 亚洲欧美影音先锋| 日韩一区二区三区精品视频| 99精品视频在线观看免费| 日本一区中文字幕| 亚洲日本乱码在线观看| 亚洲精品在线网站| 欧美精品乱码久久久久久| 成人免费视频视频在线观看免费 | 国产精品久久久久影院亚瑟| 91精品国产综合久久久久久漫画| 精品亚洲国内自在自线福利| 亚洲黄色小视频| 精品成人一区二区| 欧美肥妇bbw| 99精品视频一区| 国产精品伊人色| 日韩高清不卡一区二区三区| 国产精品色噜噜| 91精品国产高清一区二区三区| 色综合天天综合在线视频| 狠狠色狠狠色综合系列| 蜜桃av一区二区在线观看| 亚洲最新在线观看| 国产偷国产偷精品高清尤物 | 亚洲h在线观看| 一区二区三区在线观看视频| 国产三级一区二区| 久久精品一区二区三区不卡| 欧美日韩高清在线| 亚洲你懂的在线视频| 国产精品污www在线观看| 精品剧情在线观看| 日韩一区二区三区观看| 欧美一区二区福利在线| 欧美精品1区2区| 91精品国产综合久久久久久久久久| 欧美精三区欧美精三区| 884aa四虎影成人精品一区| 欧美视频中文字幕| 欧美午夜精品久久久久久孕妇 | a美女胸又www黄视频久久| 成人深夜福利app| 色婷婷国产精品综合在线观看| 91在线免费看| 欧美亚洲高清一区| 日韩一区国产二区欧美三区| xvideos.蜜桃一区二区| 国产精品久久久久久久久果冻传媒 | 在线看国产日韩| 色婷婷国产精品综合在线观看| 欧洲一区在线电影| 欧美精品成人一区二区三区四区| 91精品国产品国语在线不卡| 久久美女艺术照精彩视频福利播放 | 欧美色偷偷大香| 欧美一区二区三区免费大片| 欧美精品一区男女天堂| 国产精品国产三级国产| 亚洲国产成人av| 精品一区二区三区影院在线午夜| 国产69精品久久777的优势| 在线精品视频免费播放| 日韩精品一区二区在线| 中文字幕电影一区| 日韩精品亚洲专区| 成年人网站91| 日韩精品中文字幕一区二区三区 | 国产米奇在线777精品观看| 成人福利视频在线| 欧美一三区三区四区免费在线看| 国产日韩欧美综合在线| 性做久久久久久久免费看| 国产精品自在在线| 欧美自拍偷拍午夜视频| 精品盗摄一区二区三区| 亚洲aaa精品| 99久久夜色精品国产网站| 日韩一级片网址| 亚洲欧美日韩国产中文在线| 国产乱妇无码大片在线观看| 这里只有精品99re| 亚洲一区二区美女| 91麻豆精品秘密| 中文字幕av不卡| 国模少妇一区二区三区| 91精品国产综合久久久久久漫画 | 国产麻豆9l精品三级站| 99久久精品免费| 欧美日本高清视频在线观看| 久久精品免费看| 日韩一区二区高清| 黑人精品欧美一区二区蜜桃 | 美女www一区二区| 成人网在线免费视频| 国产成人精品影院| 欧美三级欧美一级| 中文字幕中文乱码欧美一区二区| 欧美性生活影院| 香蕉成人啪国产精品视频综合网| 免费一区二区视频| 欧美色视频在线| 亚洲免费观看高清完整| 91猫先生在线| 亚洲乱码国产乱码精品精98午夜| 91丨porny丨蝌蚪视频| 精品捆绑美女sm三区| 日韩av电影天堂| 欧美日韩高清一区二区不卡| 亚洲午夜精品久久久久久久久| 国产麻豆精品久久一二三| 欧美成人a视频| 日日夜夜免费精品视频| 欧美一区二区三区在线看| 亚洲成av人影院| 欧美日本在线播放| 日韩不卡在线观看日韩不卡视频| 欧美精品久久一区| 开心九九激情九九欧美日韩精美视频电影 | 一区二区三区美女视频| 在线观看日韩高清av| 日本女人一区二区三区| 日韩欧美国产系列| 国产经典欧美精品| 亚洲色图第一区| 欧美美女bb生活片| 国产一区二区三区| 亚洲嫩草精品久久| 日韩午夜激情av| 成人一区二区三区在线观看| 18欧美亚洲精品| 欧美三电影在线| 经典三级一区二区| 欧美疯狂性受xxxxx喷水图片| 国产欧美1区2区3区| 在线观看国产日韩| 777欧美精品| 精品国产区一区| 欧美激情一区三区| 欧美xxxxx裸体时装秀| 国产一区二区三区香蕉| 亚洲综合色丁香婷婷六月图片| 欧美色精品在线视频| 韩国av一区二区| 亚洲一区二区高清| 中文字幕五月欧美| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 蜜桃av噜噜一区| ww久久中文字幕| 色就色 综合激情| 国产麻豆视频精品| 亚洲成人免费av| 欧美激情综合在线| 欧美一二三区在线观看| 在线观看一区二区精品视频| 风流少妇一区二区| 美女国产一区二区三区| 亚洲在线中文字幕| 欧美国产精品中文字幕| 亚洲福利一二三区| 久久午夜色播影院免费高清| 91蜜桃网址入口| 国产aⅴ精品一区二区三区色成熟| 亚洲bdsm女犯bdsm网站| 亚洲精品视频免费看| 国产精品二三区| 精品国产91乱码一区二区三区|