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檔案...