20161217py學習筆記 魔法方法

2022-08-29 01:27:06 字數 2962 閱讀 9263

1、魔法方法也是method,也是定義class中用到函式,只不過這些函式的名字,前後都是雙下劃線。

初始化:__init__

class foobar:

def __init__(self,value=42):

self.somevar=value

原來想用『somevar』,大概得這麼寫:

>>>f=foobar()

>>>f.__init__

#如果__init__下還有幾個self.some*,這麼一寫得全引用出來,但是我們想用的只是somevar,所以用__init__可以寫成如下形式:

>>>f=foobar()

>>>f.somevar #定義在初始化中,直接就拿來用

>>>42

#加個引數也可以:

>>>f=foobar('this is a constructor argument')

>>>f.somevar

>>>this is aconstructor argument

2、superclass與subclass都有構造方法的情況下,subclass如何呼叫superclass的構造方法

class bird:

def __init__(self):#這是類的方法

self.hungry=true

def eat(self):#這是例項的方法

if self.hungry:

print'aaaah...'

self.hungry=false

else:

print'no,thanks!'

class songbird(bird):

def __init__(self):

self.sound='squawk!'

def sing(self):

print self.sound

>>>sb=songbird()

>>>sb.eat()

會報錯,因為subclass的構造方法把superclass的覆蓋了。

在subclass中新增superclass的構造方法

做如下修改:

class songbird(bird):

def __init__(self):

bird.__init__(self)#在subclass的構造方法中,加上superclass的構造方法

self.sound='squawk!'

def sing(self):

print self.sound

但是輸出時,會變得比較奇怪。

>>>sb=songbird()

>>>sb.eat()

>>>'aaaah...'

>>>sb.eat()

>>>'no,thanks'

這是因為在呼叫例項的方法時,self引數會被自動繫結到例項上(這也是上面的例子(***),為什麼直接呼叫sb.eat()會說no thanks),if句子根本沒起作用;

直接呼叫類的方法(bird.__init__),就沒有例項被繫結。

使用superclass直接呼叫

class songbird():

def __init__():

super(bird,self).__init__()

self.sound='squawk!'

def sing(self):

print self.sound

3、魔法方法之基本的序列和對映規則

def checkindex(key):

'''所給的鍵是能接受索引的嗎?為了能被接受,鍵應該是乙個非負的整數。如果它不是乙個整數,會引發typeerror;如果是負數,會引發indexerror。(因為序列是無限長的)。

if not isinstance(key,(int,long)):raise typeerror

if key<0: raise indexerror

class arithmeticsequence:

def __init__(self,start=0,step=1):

'''初始化算術序列

self.start,序列中的第乙個值

self.step,兩個相鄰的差值

self.changed,使用者修改的值得字典

self.start=start

self.step=step

self.changed={}

def __getitem__(self,key):

'''get an item from the aritmetic sequence.

'''try: return self.changed[key] #修改了嗎?

except keyerror: #否則...

return self.start+key*self.step #...計算值

def __setitem__(self,key,value):

'''修改算術序列中的乙個項

'''checkindex(key)

self.changed[key]=value #儲存更改後的值

4、子類化list/dict/string

class counterlist(list):#subclass counterlist繼承了superclass list的特性

def __init__(self,*args):

super(counterlist,self).__init__(*args)#super函式,呼叫superclass list的構造方法

self.counter=0

def __getitem__(self,index):#重寫了__getitem__方法

self.counter+=1

return super(counterlist,self).__getitem__(index)

py學習筆記

1.切片 list l l 2 4 l 1 10 2 同matlab l 複製 tuple 0,1,2,3,4 0 3 字串2.print 預設換行 print x 不換行print x,print y,orprint x,y 3.變數賦值 不需要型別宣告 gg 100.0 i,lov,u 233,...

20161207py學習筆記

正在學習 dive into python,1 if name main 這句話的作用 if name main 寫上這句話,使得py檔案可以被當做模組import,也可以直接execute 2 import自定義模組 一般而言,通過,import sys print sys.path 只要檔案在s...

學習筆記 03 Python教程 py檔案

立即學習 python shell適合小段 臨時使用 py檔案 usr bin env python3 coding utf 8 第一行為直譯器宣告,必須為檔案第一行,前面不能有空行 linux用到 有不太一樣的寫法 第二行是檔案編碼宣告,不寫的話,interpreter預設用ascii解碼py檔案...