python 魔法方法,屬性和迭代器
(一)魔法方法
在python中,有的名稱在前後會加上兩個下劃線,具有特殊的含義,大部分會在某些條件下自動被呼叫。這裡簡單介紹幾種重要的魔法方法。當然這是所有用途中的一小部分。
(1)構造方法
在類的定義中,我們常常加入構造方法。這樣我們在建立該類的例項時,會自動執行該方法:
class Bird(object):
def __init__(self):
self.hungry=Ture`
構造方法繼承的注意事項
當我們建立一個類,並從它的超類中繼承構造方法時,我們經常需要重寫構造方法。比如下面這個例子:
class SongBird(Bird):
def __init__(self):
self.sound='squake'`
但是我們需要注意,這樣的話這個類的例項就沒有了hungry的特性。為了讓兩種構建方法都執行,我們可以採取呼叫超類構造方法的未繫結版本或者使用super函式:
# 呼叫超類構造方法的未繫結版本
def init(self):
Bird.init(self)
self.sound='squake'
#使用super函式(會呼叫SongBird的所有超類的建構函式 )
def __init__(self):
super(SongBird,self).__init__()
self.sound='squake'
(2)成員訪問
我們都知道,基本的序列有a[],a[2:3]這樣的成員訪問功能,我們如果需要我們自己建立的類也有這樣的功能,就需要類有兩種魔法方法就可以了。(如果成員可變,需要四個)
1, len(self):
2, getitem(self,key):
3, setitem(self,key,value):
4, delitem(self,key):
當然我們可以直接把類的超類設定成list,然後將我們需要修改的魔法方法重寫就可以了。
(二)屬性
有時候物件的特性之間存在關係,比如size由width和height組成,一旦size變化,後兩者也會變化;反之同理。於是我們需要一種特殊的特性:屬性。屬性並不是在init中直接定義,而是通過訪問器(get,set等方法)定義的特性。
建立屬性的機制大致上有property函式,__getattr__等魔法方法。
- property函式
property最多可以用四個引數呼叫,分別是做fget,fset,fdel,doc:
class Rectangle
def init(self):
self.width=0
self.height=0
def setsize(self,size):
self.width,self.height=size
def getsize(self):
return self.width,self.height
size=property(getsize,setsize) - __getattr__,__setattr__和它的朋友們:
__getattr__(self,name):當特性name被訪問時被自動呼叫
__getattr__(self,name):當特性name被訪問且沒有相應物件時被自動呼叫
__setattr__(self,name,value):在試圖給特性name賦值時會被自動呼叫
__delattr__(self,name):在試圖刪除特性name時會被自動呼叫
class Rectangle:
def __init__(self):
self.width=0
self.height=0
def __setattr__(self,name,value):
if name=='size':
self.width,self.height=size
else:
self.__dict__[name]=value
def __getattr__(self,name):
if name=='size':
return self.width,self.height
else:
raise AttributeError
迭代器
我們之前已經遇到了很多可以迭代的物件。序列的類就可以實現for a in lists這樣的操作。為了使我們自己定義的類也是可迭代物件,我們需要在類中定義__iter__的方法,它會返回一個迭代器。
迭代器是指擁有next()方法的物件,這樣我們就可以迴圈下去了。為了方便起見,推薦我們定義的類有next()方法和__iter__方法,後者返回的迭代器用自己就行了。
class Fibs:
def __init__(self):
self.a=0
self.b=0
def next(self):
self.a,self.b=self.b,self.a+self.b
return self.a
def __iter__(self):
return self
for one in Fibs():
if(one>100):
print one
break
生成器
生成器函式是一種特殊的函式,函式會返回一個生成器(可以像其它迭代器一樣使用)。相對於普通函式直接生成一個列表,再對列表進行迭代的優點是對於較大規模的資料,它會逐個生成結果,節約了大量空間,如果中途需要結束的話也不用再生成後續結果。這就是迭代的優勢。
生成器的核心是yield語句,和return語句不同的是,它不僅返回值,而且會在該處凍結函式,函式重新被喚醒後從該點繼續執行。
def flatten(nexted):
for sublist in nested:
for element in sublist:
yield element
nested=[[1,2],[2,6],[5]]
for num in flatten(nested):
print num
相關文章
- python黑魔法---迭代器(iterator)Python
- python三種屬性管理魔法函式Python函式
- 課時45:魔法方法:屬性訪問
- Python迭代和迭代器詳解Python
- 屬性和方法
- JavaScript公有屬性、私有屬性、公有方法和原型方法JavaScript原型
- Function方法和屬性圖Function
- python屬性和方法的區別是什麼Python
- Python中訪問私有屬性和私有方法Python
- vue計算屬性和vue實力的屬性和方法Vue
- Python 動態新增例項屬性,例項方法,類屬性,類方法Python
- XML DOM – 屬性和方法概述XML
- 字串的常用屬性和方法字串
- 實驗6 方法和屬性
- WebElement的常用屬性和方法Web
- js 私有方法屬性和公有方法屬性簡單介紹JS
- Python 迭代器Python
- Python迭代器Python
- Python:迭代器Python
- C#索引器和屬性C#索引
- 1.5.4 Python迭代器和生成器Python
- Python的迭代器和生成器Python
- Python進階:迭代器與迭代器切片Python
- 數值常用的屬性和方法
- vue例項的屬性和方法Vue
- 類的靜態屬性和方法
- XmlTextReader方法和屬性一覽XML
- 迭代器,迭代器塊和資料管道
- Python類屬性和例項屬性分別是什麼?Python
- Python的tkinter獲取元件屬性和設定元件屬性Python元件
- python進階-魔法方法Python
- python:類3——魔法方法Python
- defer 屬性和 async 屬性
- 織夢kindeditor編輯器圖片上傳增加圖片alt屬性和title屬性的方法
- python 中的魔法方法:__str__ 和__repr__Python
- Python之裝飾器、迭代器和生成器Python
- python3.7 迭代器和生成器Python
- Python可迭代的物件與迭代器Python物件