python魔法函数和装饰器_python魔法方法、构造函数、序列与映射、迭代器、生成器...
在Python中,所有以__雙下劃線包起來的方法,都統(tǒng)稱為"魔術方法"。比如我們接觸最多的__init__,魔法方法也就是具有特殊功能的方法。
構造函數(shù)
構造函數(shù)不同于普通方法,將在對象創(chuàng)建后自動調用它們。也就是在對象創(chuàng)建完成后,自動會調用__init__方法來初始化。
創(chuàng)建一個構造方法
構造方法傳參
>>> classFooBar:def __init__(self,value=42): #默認參數(shù)
self.somevar=value>>> f = FooBar('This is a constructor argumnet')>>>f.somevar'This is a constructor argumnet'
構造方法的重寫
普通方法就不說了,一下是特殊方法的重寫方式:
1.調用超類構造方法的未綁定版本;2.使用super函數(shù)
(1)調用未綁定的超類構造方法:Bird.__init__(self)
(2)使用super函數(shù) super(SongBird, self).__init__()
當前的類和對象可以作為super函數(shù)的參數(shù)使用,調用函數(shù)返回的對象的任何方法都是調用超類的方法,而不是當前類的方法。也就是說函數(shù)super返回的是一個super對象,這個對象為你執(zhí)行方法解析,當你訪問它的屬性時,它將在所有的超類中查找,直到找到指定屬性或者引發(fā)AttributeError異常。通常使用super()函數(shù)不提供任何參數(shù)方式。
成員訪問
基本的序列和映射規(guī)則
序列和映射是對象的集合,對象不可變,需使用2個魔法方法;對象可變需使用4個
(1)__len_(self):這個方法返回集合中所含項目的數(shù)量。對于序列就是元素的個數(shù);對于映射則是鍵-值對的數(shù)量。
(2)__getitem__(self,key):這個方法返回與所給鍵對應的值。對于序列:鍵應該是一個0~n-1的整數(shù),n是序列的長度;對于映射:可以使用任何種類的鍵。
(3)__setitem__(self,key,value):這個方法按一定的方式存儲和key相關的value,該值隨后可使用__getitem__來獲取。
(4)__delitem__(self,key):對一部分對象使用del語句是被調用,同時必須刪除和元素相關的鍵;可修改對象定義的(并不是刪除全部的對象,而只刪除一些需要移除的元素)
下面是一個無窮序列的例子:
子類化列表,字典和字符串
特性--property函數(shù)
property函數(shù)可以用0,1,2,3或者4個參數(shù)來調用。
property的4個參數(shù)分別被叫做fget,fset,fdel和doc。
沒有指定參數(shù)創(chuàng)建的特性將不可讀寫,指定一個參數(shù)只讀,第三個參數(shù)可選,用于刪除屬性的方法,第四個也是可選,指定一個文檔字符串。
在新式類中應該使用property函數(shù)而不是訪問器方法。
靜態(tài)方法和類成員方法
靜態(tài)方法:定義沒有self參數(shù),并且能夠被類本身直接調用
類成員方法:定義時需要名為cls的類似于self的參數(shù),類成員方法可以直接用類的具體對象調用,cls參數(shù)是自動被綁定到類的。
classMyClass:defsmeth():print('This is a static method')
smeth=staticmethod(smeth)defcmeth(cls):print('This is a class method of', cls)
cmeth= classmethod(cmeth)
裝飾器:使用@操作符
>>> classMyClass:
@staticmethoddefsmeth():print('This is a static method')
@classmethoddefcmeth(cls):print('This is a class method of',cls)>>> MyClass.smeth() #靜態(tài)方法:定義沒有self參數(shù),并且能夠被類本身直接調用
Thisisa static method>>>MyClass.cmeth()
Thisis a class method of
__getattr__、__setattr__等
攔截對象的所有特性訪問是可能的
魔法方法(可以對處理很多屬性的方法進行再編碼)
(1)__getattribute__(self,name):當特性name被訪問時自動被調用(只能在新式類中使用)
(2)__getattr__(self,name):當特性name被訪問且對象沒有相應的特性時被自動調用。
(3)__setattr__(self,name,value):當試圖給特性name賦值時會被自動調用。
(4)__delattr__(self,name):當試圖刪除特性name時被自動調用。
特殊方法__dict__,該方法包含一個字典,字典里面是所有實例的屬性,為避免__setattr__方法被再次調用(這樣程序陷入死循環(huán)),__dict__方法被用來代替普通的特性賦值操作。
迭代器
列表會占用太多內存,使用迭代器更通用、簡單優(yōu)雅。
特殊方法:__iter__,這個方法是迭代器規(guī)則的基礎
__iter__方法返回一個迭代器,它是包含方法__next__的對象,而調用這個方法時可以不提供參數(shù)。當調用方法__next__時,迭代器返回其下一個值。如果迭代器沒有可提供返回的值,引發(fā)StopIteration異常。
實現(xiàn)了__iter__方法的對象是可迭代的,一個實現(xiàn)了next方法的對象則是迭代器。
從迭代器得到序列
使用list構造方法顯示地將迭代器轉化為列表
>>> classTestIterator:
value=0def __next__(self): #此處是python3.0的版本,3.0以前的版本是用def next(self):
self.value+=1
if self.value >10:raiseStopIterationreturnself.valuedef __iter__(self):returnself>>> ti =TestIterator()>>>list(ti)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
生成器
生成器是一種使用普通函數(shù)語法定義的迭代器。
創(chuàng)建生成器(處理兩層嵌套)
功能:順序打印出列表中的數(shù)字
生成器與函數(shù)的區(qū)別在于,生成器不是使用return返回一個值,而是可以生成多個值,每次一個。每次使用yiled生成一個值后,函數(shù)都將凍結,停止執(zhí)行,等待重新被喚醒。被重新喚醒之后,函數(shù)將從停止的地方開始繼續(xù)執(zhí)行。
遞歸生成器
如果要處理任意層嵌套的列表,每一層都需要一個for循環(huán),也可以使用遞歸。
通用生成器
生成器是一個包含yield關鍵字的函數(shù),當它被調用時,在函數(shù)體中的代碼不會被執(zhí)行,而返回一個迭代器。
每次請求一個值,就會執(zhí)行生成器中的代碼,直到遇到一個yield或者return語句。
yield語句意味著應該生成一個值,return語句意味著生成器要停止執(zhí)行。
生成器由兩部分組成:生成器的函數(shù)和生成器的迭代器。生成器的函數(shù)是用def語句定義的,包含yield的部分。生成器的迭代器是這個函數(shù)返回的部分。
生成器的方法
外部作用域訪問生成器的send方法
內部則掛器生成器,yield作為表達式而不是語句使用。即當生成器重新運行時,yield返回一個值,通過send從外部世界發(fā)送的值。如果使用的是next,yield將返回一個None
>>> defrepeater(value):whileTrue:
new= (yieldvalue)if new is notNone:
value=new>>> r=repeater(42)>>>r.next()42
>>> r.send("Hello, world!")'Hello, world!'
總結
以上是生活随笔為你收集整理的python魔法函数和装饰器_python魔法方法、构造函数、序列与映射、迭代器、生成器...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux终端密码星星,如何获得您的su
- 下一篇: python匿名函数里用for_请问这段