python魔法函数和装饰器_python魔法方法、构造函数、序列与映射、迭代器、生成器...
在Python中,所有以__雙下劃線包起來的方法,都統稱為"魔術方法"。比如我們接觸最多的__init__,魔法方法也就是具有特殊功能的方法。
構造函數
構造函數不同于普通方法,將在對象創建后自動調用它們。也就是在對象創建完成后,自動會調用__init__方法來初始化。
創建一個構造方法
構造方法傳參
>>> classFooBar:def __init__(self,value=42): #默認參數
self.somevar=value>>> f = FooBar('This is a constructor argumnet')>>>f.somevar'This is a constructor argumnet'
構造方法的重寫
普通方法就不說了,一下是特殊方法的重寫方式:
1.調用超類構造方法的未綁定版本;2.使用super函數
(1)調用未綁定的超類構造方法:Bird.__init__(self)
(2)使用super函數 super(SongBird, self).__init__()
當前的類和對象可以作為super函數的參數使用,調用函數返回的對象的任何方法都是調用超類的方法,而不是當前類的方法。也就是說函數super返回的是一個super對象,這個對象為你執行方法解析,當你訪問它的屬性時,它將在所有的超類中查找,直到找到指定屬性或者引發AttributeError異常。通常使用super()函數不提供任何參數方式。
成員訪問
基本的序列和映射規則
序列和映射是對象的集合,對象不可變,需使用2個魔法方法;對象可變需使用4個
(1)__len_(self):這個方法返回集合中所含項目的數量。對于序列就是元素的個數;對于映射則是鍵-值對的數量。
(2)__getitem__(self,key):這個方法返回與所給鍵對應的值。對于序列:鍵應該是一個0~n-1的整數,n是序列的長度;對于映射:可以使用任何種類的鍵。
(3)__setitem__(self,key,value):這個方法按一定的方式存儲和key相關的value,該值隨后可使用__getitem__來獲取。
(4)__delitem__(self,key):對一部分對象使用del語句是被調用,同時必須刪除和元素相關的鍵;可修改對象定義的(并不是刪除全部的對象,而只刪除一些需要移除的元素)
下面是一個無窮序列的例子:
子類化列表,字典和字符串
特性--property函數
property函數可以用0,1,2,3或者4個參數來調用。
property的4個參數分別被叫做fget,fset,fdel和doc。
沒有指定參數創建的特性將不可讀寫,指定一個參數只讀,第三個參數可選,用于刪除屬性的方法,第四個也是可選,指定一個文檔字符串。
在新式類中應該使用property函數而不是訪問器方法。
靜態方法和類成員方法
靜態方法:定義沒有self參數,并且能夠被類本身直接調用
類成員方法:定義時需要名為cls的類似于self的參數,類成員方法可以直接用類的具體對象調用,cls參數是自動被綁定到類的。
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() #靜態方法:定義沒有self參數,并且能夠被類本身直接調用
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__方法被再次調用(這樣程序陷入死循環),__dict__方法被用來代替普通的特性賦值操作。
迭代器
列表會占用太多內存,使用迭代器更通用、簡單優雅。
特殊方法:__iter__,這個方法是迭代器規則的基礎
__iter__方法返回一個迭代器,它是包含方法__next__的對象,而調用這個方法時可以不提供參數。當調用方法__next__時,迭代器返回其下一個值。如果迭代器沒有可提供返回的值,引發StopIteration異常。
實現了__iter__方法的對象是可迭代的,一個實現了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]
生成器
生成器是一種使用普通函數語法定義的迭代器。
創建生成器(處理兩層嵌套)
功能:順序打印出列表中的數字
生成器與函數的區別在于,生成器不是使用return返回一個值,而是可以生成多個值,每次一個。每次使用yiled生成一個值后,函數都將凍結,停止執行,等待重新被喚醒。被重新喚醒之后,函數將從停止的地方開始繼續執行。
遞歸生成器
如果要處理任意層嵌套的列表,每一層都需要一個for循環,也可以使用遞歸。
通用生成器
生成器是一個包含yield關鍵字的函數,當它被調用時,在函數體中的代碼不會被執行,而返回一個迭代器。
每次請求一個值,就會執行生成器中的代碼,直到遇到一個yield或者return語句。
yield語句意味著應該生成一個值,return語句意味著生成器要停止執行。
生成器由兩部分組成:生成器的函數和生成器的迭代器。生成器的函數是用def語句定義的,包含yield的部分。生成器的迭代器是這個函數返回的部分。
生成器的方法
外部作用域訪問生成器的send方法
內部則掛器生成器,yield作為表達式而不是語句使用。即當生成器重新運行時,yield返回一個值,通過send從外部世界發送的值。如果使用的是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
- 下一篇: phpwindexp.php,phpwi