標籤:回顧 name 方式 elf 類的屬性 class str 方法 對象
物件導向編程是一種編程方式,最主要的特點是需要使用 "類"和 "對象" 來實現,類可以看作一個模板,模板裡可以包含很多方法,方法可以實現一些功能;對象則是建立模板的執行個體,通過執行個體對象可以執行類中的方法。
類
1.認識類
通常我們把“鳥類”想象成所有鳥的集合,因此“鳥類”就是一個非常抽象的類;鳥普遍能飛需要食物,因此“能飛”和“需要食物”就是這個類的屬性。再者我們不會說這是一隻鳥類,而只會說這是一隻鳥,於是“這隻鳥”便成了“鳥類”的執行個體。
1 >>> class Bird: 2 def __init__(self): 3 self.hungry = True 4 def eat(self): 5 if self.hungry: 6 print "55555" 7 self.hungry = False 8 else: 9 print "no,thanks!"10 11 >>> b = Bird() #b是類Bird的執行個體12 >>> b.eat()13 55555
如果說“鳥類”是一個類,那“百靈鳥”便是“鳥類”的一個子類;反言之,“鳥類”是“百靈鳥”的父類,這是一隻百靈鳥,也可以說“這隻百靈鳥”是“百靈鳥”的執行個體化。
1 >>> class Lark(Bird): 2 def __init__(self): 3 self.sound = ‘JOJO‘ 4 def sing(self): 5 print self.sound 6 7 >>> lark = Lark() 8 >>> lark.sing 9 <bound method Lark.sing of <__main__.Lark instance at 0x03AB98A0>>10 >>> lark.sing()11 JOJO
2.定義子類
通常一個類的定義取決於它所支援的方法,子類可以繼承父類所有的方法;於是定義一個子類,便是一個定義更多方法(也可能是重載已經存在的方法)的過程。比如,企鵝Penguin(Bird的子類)不會fly,當建立Penguin類時,可能會想要重寫父類的fly方法,對於Penguin的執行個體來說,這個fly方法要不什麼也做不了,要不就會異常,因為企鵝不會飛。
1 >>> lark.eat() #子類對象調用父類eat()方法2 3 Traceback (most recent call last):4 File "<pyshell#61>", line 1, in <module>5 lark.eat()6 File "<pyshell#48>", line 5, in eat7 if self.hungry:8 AttributeError: Lark instance has no attribute ‘hungry‘
調用Bird類的eat方法異常,是因為Lark類的構造方法__init__被重寫了,新的構造方法沒有初始化父類hungry屬性的代碼,正確的應該是在self.sound = ‘JOJO‘代碼前,加上Bird.__init__(self),python3.5也可以用super(Lark.self).__init__()代替。
1 >>> class Lark(Bird):2 def __init__(self):3 Bird.__init__(self) #或者super(Lark.self).__init__()4 self.sound = ‘JOJO‘5 def sing(self):6 print self.sound7 8 >>> lark = Lark()
9 >>> lark.eat()
55555
構造方法:代表著名為init的初始化方法,和其他普通方法不同在於,當一個對象被建立後,會立即調用構造方法,用來初始化新建立對象的狀態,大多數子類不僅要用於自己的初始化代碼,還要父類的初始化代碼。
3. 私人方法
方法或特性若公有變為私人(從類外部無法訪問),只需要在它的名字前面加上雙底線即可。
1 >>> class Secretive: 2 def __A(self): 3 print ‘no see‘ 4 def B(self): 5 print ‘hello,you can see me‘ 6 7 >>> s1 = Secretive() 8 >>> s1.A() 9 10 Traceback (most recent call last):11 File "<pyshell#69>", line 1, in <module>12 s1.A()13 AttributeError: Secretive instance has no attribute ‘A‘14 >>> s1.B()15 hello,you can see me
4.建立內建類型的子類
一般內建對象是基於類型(list,tuple,string,dic和number)的,自訂的對象則是基於類的。可以建立類但是不能建立類型。但是最新的python,基本類型和類的界限開始模糊了。
1 >>> class CountList(List): #定義一個帶訪問計數的列表 2 def __init__(self,*args): 3 super(CountList,self).__init__(*args) #python2.7不可以用super直接調用自身,獲得父類方法,只能用List__init__(self):代替 4 self.counter = 0 5 def __getitem__(self,index): 6 self.count += 1 7 return super(CountList,self).__getitem__(index) 8 9 10 >>> c1 = CounterList(range(5))11 [1,2,3,4,5]12 >>> c1.counter13 014 >>>c1[2] +c1[3]15 716 >>>c1.counter17 2
對象
在Python中一切皆對象,對象(object)基本上可以看作資料(屬性)以及操作這些資料的方法組成的集合。對象的特點:
a.多態:意味著可以對不同類的對象使用相同的操作,很多函數和運算子都是多態的
1 >>> def add(x,y):2 return x + y3 4 >>> add(1,2)5 36 >>> add(‘abc‘,‘ef‘)7 ‘abcef‘
b.封裝:把類所需要的資料(類的屬性)和對資料的操作(類的方法)全部都寫進類的過程,簡化編程,對外部隱藏內部工作細節。
1 >>> class Person: 2 def __init__(self): 3 self.name = ‘ann‘ 4 >>> p1 = Person() 5 >>> p1.name 6 ‘ann‘ 7 >>> p1.name = ‘Ryana‘ 8 >>> p1.name 9 ‘Ryana‘10 11 >>> p2 = Person()12 >>> p2.name13 ‘ann‘14 #建立不同的對象p1和p2,名字不同說明對象都有自己的狀態,對象的狀態由它的屬性(eg:name)來描述,對象的方法可以改變它的屬性
c.繼承:繼承是兩個類或者多個類之間的父子關係,實現了代碼的重用,通過父類為基礎建立專門的類對象,以達到調用更多方法的目的。檢查繼承,issubclass(A,B):A類是否是B類的子類,isinstance(a,A):對象a是否是類A的執行個體
1 >>> issubclass(Lark,Bird)2 True3 >>> issubclass(Bird,Lark)4 False5 6 >>> isinstance(lark,Lark)7 True8 >>> isinstance(lark,Bird)9 True
基礎知識回顧——類和對象