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

主頁 > 知識庫 > 詳解Python常用的魔法方法

詳解Python常用的魔法方法

熱門標簽:市場上的電銷機器人 儋州電話機器人 佛山400電話辦理 北京電銷外呼系統(tǒng)加盟 小蘇云呼電話機器人 地圖標注面積 朝陽手機外呼系統(tǒng) 所得系統(tǒng)電梯怎樣主板設(shè)置外呼 北瀚ai電銷機器人官網(wǎng)手機版

一、python魔法方法

Python的魔法方法會在特定的情況下自動調(diào)用,且他們的方法名通常被雙下劃線包裹,之前我們學(xué)習(xí)的構(gòu)造函數(shù)和析構(gòu)函數(shù)就屬于魔法方法

二、運算符重載

Python中同樣有運算符重載,其實所有的運算符都是使用了對應(yīng)的魔法方法來處理的對象的,魔法方法對應(yīng)的操作符如下

我們來舉一個簡單的例子

class A:
    def __init__(self,x):
        self.x = x
    def __add__(self,other):
        return int(self.x)+int(other.x)
a = A(3.3)
b = A(5.2)
print(a+b)

類似的還有反運算重載和增量復(fù)制運算,用處較少,不再解釋


三、打印操作的魔法方法

__str__(self):返回值是str類型的,當我們需要以字符串的形式輸出對象時(調(diào)用print時),就會自動調(diào)用該方法,舉個例子

class A:
    def __str__(self):
        return '我真帥'

a = A()
print(a)# 我真帥

__repr__(self):返回值是str類型的,當我們直接在shell中輸入對象名并按下回車,就會自動調(diào)用該方法,他也有和__str__一樣的功能,但如果兩者你都重寫了,在使用print時,__str__的優(yōu)先級高,__repr__是給機器看的,__str__是給人看的,舉個例子

>>> class A:
    def __str__(self):
        return '我真帥'
    def __repr__(self):
        return '我是世界第一帥'

>>> a = A()
>>> a
我是世界第一帥
>>> print(a)
我真帥

四、屬性操作的魔法方法

  • __getattr__(self, name):定義當用戶試圖獲取一個不存在的屬性時的行為,其中name是屬性名,是一個字符串,下同
  • __getattribute__(self, name):定義當該類的屬性被訪問時的行為,該方法默認返回該屬性的值
  • __setattr__(self, name, value):定義當一個屬性被設(shè)置時的行為,value是給該屬性的值
  • __delattr__(self, name):定義當一個屬性被刪除時的行為

例如:

class A:
    def __init__(self):
        self.id = "Pyhon"
    def __getattr__(self,name):
        print(name+"這個屬性不存在")
    def __getattribute__(self,name):
        print("我訪問了"+name+"這個屬性")
        return super().__getattribute__(name)
    def __setattr__(self,name,value):
        print("將屬性"+name+"置為"+value)
        super().__setattr__(name,value)
    def __delattr__(self,name):
        print("將屬性"+name+"刪除了");
        super().__delattr__(name)
    def fun(self):
        pass
a = A()
a.name
a.name = "老師"
del a.name
a.fun()
# output:
# 將屬性id置為Pyhon
# 我訪問了name這個屬性
# name這個屬性不存在
# 將屬性name置為老師
# 將屬性name刪除了
# 我訪問了fun這個屬性

結(jié)果可以看出,當我們訪問一個屬性的時候,先是調(diào)用了__getattribute__,如果該屬性不存在,則再調(diào)用__getattr__

使用這幾個的方法的時候,要注意不要陷入無限遞歸,運算符重載的時候也容易犯這種錯誤,例如下面的錯誤

class A:
    def __init__(self):
        self.id = "Pyhon"
    def __setattr__(self,name,value):
        print("將屬性"+name+"置為"+value)
        if(name == "id"):
            self.id = value

a = A()

執(zhí)行這段程序的時候?qū)⑾萑霟o限遞歸,原因是在__setattr__中,直接給self對象的屬性賦值,而這又會調(diào)用__setattr__方法。

所以在__setattr__中,我們通常會使用父類的__setattr__方法來給self對象的屬性賦值,這不會陷入無限遞歸,其他幾個方法和運算符重載也是同理,上面程序訂正后如下

class A:
    def __init__(self):
        self.id = "Pyhon"
    def __setattr__(self,name,value):
        print("將屬性"+name+"置為"+value)
        if(name == "id"):
            super().__setattr__(name,value)

a = A()
# output
# 將屬性id置為Pyhon

五、描述符

  • __get__(self, instance, owner):通過其他實例對象來訪問該類的實例對象時會調(diào)用該方法,返回該實例對象的引用。其中instance是訪問該對象的實例對象的引用,下同,owner是訪問該對象的類對象
  • __set__(self, instance, value):通過其他實例對象來給該類的實例對象賦值時會調(diào)用該方法。其中value是給該對象賦的值
  • __delete__(self, instance):通過其他實例對象來刪除該類的實例對象時會調(diào)用該方法
class Fit:
    def __init__(self):
        self.height = 180
        self.weight = 80
    def __get__(self,instance,owner):
        print("get:",instance,owner)
        return [self.height,self.weight]
    def __set__(self,instance,value):
        print("set:",instance,value)
        self.height = value
        self.weight = value/2
    def __delete__(self,instance):
        del self.height
        del self.weight
        print("delete:",instance)

class Test:
    fit = Fit()
        
t = Test()
print (t.fit)
t.fit = 190
del t.fit
# output:
# get: __main__.Test object at 0x0000023EFFA738C8> class '__main__.Test'>
# [180, 80]
# set: __main__.Test object at 0x0000023EFFA738C8> 190
# delete: __main__.Test object at 0x0000023EFFA738C8>

通常情況下,上面幾個魔法方法,當我們需要定義一個屬性,且希望可以直接對該屬性進行相應(yīng)的操作,而不是通過調(diào)用方法的方式來進行操作時,我們可以定義一個該屬性的類,實現(xiàn)上面幾個魔法方法,將需要用到的屬性作為其實例對象,這樣就完成了,例如上面的Fit,其實就是體型類,而Test中有一個體型屬性叫fit,我們在Fit中定義了一些對Fit的實例對象操作時執(zhí)行的操作。

六、定制序列

  • __len__(self):定義當該類的實例對象被len()調(diào)用時的行為
  • __getitem__(self, key):定義獲取該類的實例對象中指定元素的行為,也就是說執(zhí)行self[key]時的行為
  • __setitem__(self, key, value):定義設(shè)置該類的實例對象中指定元素的行為,相當于self[key] = value
  • __delitem__(self, key):定義刪除該類的實例對象中指定元素的新聞,相當于del self[key]
class CountList:
    def __init__(self,*args):
        self.values = [x for x in args]#這是一個列表推導(dǎo)式,把args里的元素作為values的元素
        self.count = {}.fromkeys(range(len(self.values)),0)

    def __len__(self):
        return len(self.values)

    def __getitem__(self,key):
        self.count[key] += 1;
        return self.values[key]

c = CountList(1,3,5,7,9,11)
print(c[1])
print(c[1]+c[2])
print(c.count)
# output:
# 3
# 8
# {0: 0, 1: 2, 2: 1, 3: 0, 4: 0, 5: 0}

該類中的count是記錄對應(yīng)元素被訪問的次數(shù),其他兩個也差不多,不再舉例了

七、迭代器

迭代器,就是提供了迭代方法的容器,而所謂的迭代方法,就是下面這兩個__iter____next__
可迭代,就是提供了__iter__方法的容器,我們之前講的字符串,列表,元組,字典,集合都是可迭代的,但他們不是迭代器,可以使用Python的內(nèi)置函數(shù)iter(iterable)來獲取他們相應(yīng)的迭代器,而迭代器使用next(iterator)可以獲取下一個元素,而這兩個方法其實就是調(diào)用了迭代器的__iter____next__

  • __iter__(self):定義獲取迭代器時的行為
  • __next__(self):定義獲取迭代器對應(yīng)的下一個元素時的行為
class Fb:
    def __init__(self,n = 20):
        self.a = 0
        self.b = 1
        self.n = n
    def __iter__(self):
        return self
    def __next__(self):
        t = self.a
        self.a = self.b
        self.b = t + self.b
        if(self.a = self.n):
            return self.a
        else:
            raise StopIteration

f = Fb()
for i in f:
    print(i,end=' ')
# output:1 1 2 3 5 8 13 

其中 raise 是返回一個異常,上面的程序等價于下面這個

class Fb:
    def __init__(self,n = 20):
        self.a = 0
        self.b = 1
        self.n = n
    def __iter__(self):
        return self
    def __next__(self):
        t = self.a
        self.a = self.b
        self.b = t + self.b
        if(self.a = self.n):
            return self.a
        else:
            raise StopIteration

f = Fb()
it = iter(f)
while True:
    try:
        i = next(it)
        print(i, end=' ')
    except StopIteration:
        break;

這樣我們就很清楚Python中for循環(huán)的原理了,先通過iter來獲取迭代器對象,然后不斷調(diào)用next來獲取下一個元素賦值給i,直到遇到StopIteration異常

到此這篇關(guān)于詳解Python常用的魔法方法的文章就介紹到這了,更多相關(guān)python魔法方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 詳解Python魔法方法之描述符類
  • 總結(jié)Python常用的魔法方法
  • Python面向?qū)ο竽Хǚ椒ê蛦卫K代碼實例
  • Python魔法方法 容器部方法詳解
  • Python類中的魔法方法之 __slots__原理解析
  • Python魔法方法功能與用法簡介
  • Python魔法方法詳解
  • python魔法方法-屬性訪問控制詳解
  • python魔法方法-屬性轉(zhuǎn)換和類的表示詳解
  • python魔法方法-自定義序列詳解
  • Python中的魔法方法深入理解

標簽:江蘇 金融催收 云南 酒泉 商丘 定西 龍巖 寧夏

巨人網(wǎng)絡(luò)通訊聲明:本文標題《詳解Python常用的魔法方法》,本文關(guān)鍵詞  詳解,Python,常用的,常,用的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《詳解Python常用的魔法方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于詳解Python常用的魔法方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美成人乱码一区二区三区| 国产精品久久久久久久蜜臀| 日本一区二区三区视频视频| 亚洲欧洲精品天堂一级 | 欧美日韩精品久久久| 国产亚洲一区二区三区在线观看 | 色爱区综合激月婷婷| 欧美www视频| 亚洲一区二区欧美| 成人动漫av在线| 亚洲图片自拍偷拍| 91同城在线观看| 中文字幕高清一区| 极品少妇xxxx精品少妇偷拍| 69精品人人人人| 亚洲综合色在线| 91福利在线免费观看| 综合电影一区二区三区| 高清国产一区二区| 久久久国际精品| 国产伦精品一区二区三区免费迷| 欧美精品精品一区| 亚洲在线一区二区三区| 91福利区一区二区三区| 日韩美女啊v在线免费观看| 国产精品77777竹菊影视小说| 精品国产免费久久 | 国产精品亚洲а∨天堂免在线| 91精品国产高清一区二区三区蜜臀 | 欧美精品xxxxbbbb| 亚洲国产日日夜夜| 欧美体内she精高潮| 亚洲综合视频网| 欧美性受极品xxxx喷水| 亚洲一区成人在线| 欧美视频中文一区二区三区在线观看| 一区二区在线观看av| 色哟哟一区二区三区| 亚洲欧美日韩在线| 91久久免费观看| 亚洲综合在线观看视频| 欧美性猛片aaaaaaa做受| 亚洲另类色综合网站| 在线观看中文字幕不卡| 日本亚洲最大的色成网站www| 日韩三级视频中文字幕| 紧缚奴在线一区二区三区| 久久久久久久电影| 99re在线精品| 午夜精品福利一区二区三区蜜桃| 56国语精品自产拍在线观看| 韩国精品在线观看| 日韩美女精品在线| 欧美一区二区在线免费观看| 精品一区二区三区在线观看国产| 欧美一区二区三区四区久久| 色8久久精品久久久久久蜜| 北岛玲一区二区三区四区| 99国产精品国产精品久久| 欧美日韩成人在线一区| 欧美日韩国产免费| 欧美撒尿777hd撒尿| 色婷婷精品大视频在线蜜桃视频| 欧美视频一区二区三区| 日韩三级精品电影久久久| 日韩免费福利电影在线观看| 精品91自产拍在线观看一区| 26uuu亚洲婷婷狠狠天堂| 久久久久九九视频| 一区二区三区日韩精品视频| 另类的小说在线视频另类成人小视频在线 | 欧美色欧美亚洲另类二区| 欧美精品18+| 国产精品欧美一区二区三区| 亚洲大片免费看| 成人av电影在线播放| 日韩免费看网站| 国产精品麻豆欧美日韩ww| 成人免费视频播放| av激情综合网| 17c精品麻豆一区二区免费| 日韩理论片中文av| 美女网站视频久久| 日本午夜精品视频在线观看| 色诱亚洲精品久久久久久| 久久久国产一区二区三区四区小说 | 成人国产精品免费观看视频| 亚洲一区二区av电影| 国产视频视频一区| 91精品国产综合久久久久久久久久| 国产一区二区三区在线观看精品 | 菠萝蜜视频在线观看一区| 欧美性猛片aaaaaaa做受| 精品裸体舞一区二区三区| 一区二区三区四区不卡在线| 91在线观看成人| 国产精品色哟哟网站| 国产99久久久国产精品| 国产午夜精品美女毛片视频| 韩国在线一区二区| 久久综合一区二区| 91看片淫黄大片一级| 天天操天天色综合| 中文字幕国产精品一区二区| 91亚洲精品久久久蜜桃| 亚洲精品成人悠悠色影视| 日本乱人伦一区| 视频在线在亚洲| 久久人人97超碰com| 成人免费看黄yyy456| 午夜精品福利一区二区三区av| 这里只有精品99re| 在线观看视频91| 亚洲综合区在线| 久久综合狠狠综合久久综合88| 麻豆国产欧美日韩综合精品二区| 成人av免费在线播放| 国产精品色在线| 国产欧美一区二区三区在线老狼| 亚洲女爱视频在线| 丝袜脚交一区二区| 欧美精品九九99久久| 51精品国自产在线| 欧美mv日韩mv国产| 欧美精品一区二区久久婷婷| 久久精品亚洲乱码伦伦中文| 中文天堂在线一区| 夜夜爽夜夜爽精品视频| 性做久久久久久免费观看欧美| 日韩精品电影在线| 国产一区二区福利视频| 99国产精品视频免费观看| 91在线观看视频| 这里是久久伊人| 国产欧美日韩在线看| 自拍偷拍亚洲欧美日韩| 亚洲国产精品视频| 精品亚洲国内自在自线福利| 白白色 亚洲乱淫| 欧美美女一区二区三区| 久久亚洲私人国产精品va媚药| 国产精品毛片无遮挡高清| 亚洲第一狼人社区| 国产精品一级片| 日本福利一区二区| www国产成人| 一区二区三区四区激情| 国产一区二区看久久| 色综合天天视频在线观看| 91精品欧美福利在线观看| 国产精品天干天干在观线| 亚洲成年人网站在线观看| 国产一区二区三区免费在线观看| caoporen国产精品视频| 91麻豆精品国产91久久久久久 | 91亚洲国产成人精品一区二区三| 欧美日韩中文一区| 欧美国产精品劲爆| 三级精品在线观看| 91在线小视频| 久久亚洲精品国产精品紫薇| 亚洲一区二区四区蜜桃| 波多野结衣一区二区三区| 日韩视频123| 亚洲午夜在线观看视频在线| 成人午夜又粗又硬又大| 亚洲一区二区中文在线| 懂色av一区二区三区免费观看 | 91精品国产综合久久福利| 中文字幕色av一区二区三区| 精品综合久久久久久8888| 欧美天堂亚洲电影院在线播放| 日本一区二区三区久久久久久久久不| 五月综合激情婷婷六月色窝| av网站免费线看精品| 国产亚洲精品7777| 经典三级视频一区| 日韩美女一区二区三区四区| 亚洲国产精品一区二区久久| 99久久综合狠狠综合久久| 欧美国产日本视频| 懂色av一区二区三区免费观看| 精品剧情在线观看| 精品一区二区在线视频| 欧美成人性福生活免费看| 婷婷久久综合九色国产成人| 欧美色图在线观看| 亚洲国产精品影院| 欧美日韩一区二区在线观看| 亚洲制服丝袜在线| 欧美亚洲综合在线| 午夜精品在线视频一区| 国产精品欧美一区二区三区| 国产一区二区三区国产| 欧美一区二区三区视频在线| 亚洲精品国产无套在线观| 91性感美女视频| 亚洲国产精品久久不卡毛片| 欧美成人a视频| 麻豆久久一区二区|