python 魔法方法瓷耙,屬性和迭代器

(一)魔法方法

在python中,有的名稱在前后會(huì)加上兩個(gè)下劃線刁赖,具有特殊的含義搁痛,大部分會(huì)在某些條件下自動(dòng)被調(diào)用。這里簡(jiǎn)單介紹幾種重要的魔法方法宇弛。當(dāng)然這是所有用途中的一小部分鸡典。

(1)構(gòu)造方法

在類的定義中,我們常常加入構(gòu)造方法枪芒。這樣我們?cè)趧?chuàng)建該類的實(shí)例時(shí)彻况,會(huì)自動(dòng)執(zhí)行該方法:

class Bird(object):
  def __init__(self):
      self.hungry=Ture`

構(gòu)造方法繼承的注意事項(xiàng)

當(dāng)我們創(chuàng)建一個(gè)類,并從它的超類中繼承構(gòu)造方法時(shí)舅踪,我們經(jīng)常需要重寫構(gòu)造方法纽甘。比如下面這個(gè)例子:

class SongBird(Bird):
  def __init__(self):
    self.sound='squake'`

但是我們需要注意,這樣的話這個(gè)類的實(shí)例就沒(méi)有了hungry的特性抽碌。為了讓兩種構(gòu)建方法都執(zhí)行悍赢,我們可以采取調(diào)用超類構(gòu)造方法的未綁定版本或者使用super函數(shù):
# 調(diào)用超類構(gòu)造方法的未綁定版本
def init(self):
Bird.init(self)
self.sound='squake'

#使用super函數(shù)(會(huì)調(diào)用SongBird的所有超類的構(gòu)造函數(shù) )
def __init__(self):
super(SongBird,self).__init__()
self.sound='squake'

(2)成員訪問(wèn)

我們都知道,基本的序列有a[]货徙,a[2:3]這樣的成員訪問(wèn)功能左权,我們?nèi)绻枰覀冏约簞?chuàng)建的類也有這樣的功能,就需要類有兩種魔法方法就可以了痴颊。(如果成員可變赏迟,需要四個(gè))
1, len(self):
2, getitem(self,key):
3, setitem(self,key,value):
4, delitem(self,key):

當(dāng)然我們可以直接把類的超類設(shè)置成list,然后將我們需要修改的魔法方法重寫就可以了祷舀。

(二)屬性

有時(shí)候?qū)ο蟮奶匦灾g存在關(guān)系瀑梗,比如size由width和height組成,一旦size變化裳扯,后兩者也會(huì)變化抛丽;反之同理。于是我們需要一種特殊的特性:屬性饰豺。屬性并不是在init中直接定義亿鲜,而是通過(guò)訪問(wèn)器(get,set等方法)定義的特性。
創(chuàng)建屬性的機(jī)制大致上有property函數(shù)蒿柳,__getattr__等魔法方法饶套。

  • property函數(shù)
    property最多可以用四個(gè)參數(shù)調(diào)用,分別是做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):當(dāng)特性name被訪問(wèn)時(shí)被自動(dòng)調(diào)用
__getattr__(self,name):當(dāng)特性name被訪問(wèn)且沒(méi)有相應(yīng)對(duì)象時(shí)被自動(dòng)調(diào)用
__setattr__(self,name,value):在試圖給特性name賦值時(shí)會(huì)被自動(dòng)調(diào)用
__delattr__(self,name):在試圖刪除特性name時(shí)會(huì)被自動(dòng)調(diào)用

  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

迭代器

我們之前已經(jīng)遇到了很多可以迭代的對(duì)象妓蛮。序列的類就可以實(shí)現(xiàn)for a in lists這樣的操作。為了使我們自己定義的類也是可迭代對(duì)象圾叼,我們需要在類中定義__iter__的方法蛤克,它會(huì)返回一個(gè)迭代器。
迭代器是指擁有next()方法的對(duì)象夷蚊,這樣我們就可以循環(huán)下去了构挤。為了方便起見(jiàn),推薦我們定義的類有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

生成器

生成器函數(shù)是一種特殊的函數(shù),函數(shù)會(huì)返回一個(gè)生成器(可以像其它迭代器一樣使用)箱歧。相對(duì)于普通函數(shù)直接生成一個(gè)列表矾飞,再對(duì)列表進(jìn)行迭代的優(yōu)點(diǎn)是對(duì)于較大規(guī)模的數(shù)據(jù),它會(huì)逐個(gè)生成結(jié)果叫胁,節(jié)約了大量空間凰慈,如果中途需要結(jié)束的話也不用再生成后續(xù)結(jié)果汞幢。這就是迭代的優(yōu)勢(shì)驼鹅。
生成器的核心是yield語(yǔ)句,和return語(yǔ)句不同的是森篷,它不僅返回值输钩,而且會(huì)在該處凍結(jié)函數(shù),函數(shù)重新被喚醒后從該點(diǎn)繼續(xù)執(zhí)行仲智。

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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末买乃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子钓辆,更是在濱河造成了極大的恐慌剪验,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件前联,死亡現(xiàn)場(chǎng)離奇詭異功戚,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)似嗤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門啸臀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人烁落,你說(shuō)我怎么就攤上這事乘粒⊥阕ⅲ” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵灯萍,是天一觀的道長(zhǎng)轧铁。 經(jīng)常有香客問(wèn)我,道長(zhǎng)旦棉,這世上最難降的妖魔是什么属桦? 我笑而不...
    開(kāi)封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮他爸,結(jié)果婚禮上聂宾,老公的妹妹穿的比我還像新娘。我一直安慰自己诊笤,他們只是感情好系谐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著讨跟,像睡著了一般纪他。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晾匠,一...
    開(kāi)封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天茶袒,我揣著相機(jī)與錄音,去河邊找鬼凉馆。 笑死薪寓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的澜共。 我是一名探鬼主播向叉,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嗦董!你這毒婦竟也來(lái)了母谎?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤京革,失蹤者是張志新(化名)和其女友劉穎奇唤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體匹摇,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咬扇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了来惧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冗栗。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出隅居,到底是詐尸還是另有隱情钠至,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布胎源,位于F島的核電站棉钧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏涕蚤。R本人自食惡果不足惜宪卿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望万栅。 院中可真熱鬧佑钾,春花似錦、人聲如沸烦粒。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)扰她。三九已至兽掰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間徒役,已是汗流浹背孽尽。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留忧勿,地道東北人杉女。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像狐蜕,于是被迫代替她去往敵國(guó)和親宠纯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容