標籤:created 私人方法 nbsp 同名 sel 代碼塊 log pmf 範圍
python --物件導向的語言,其最大的特性 為 封裝,繼承,多態。
封裝:封裝可以不關心對象是如何構建的而直接進行使用。是對全域範圍中其他地區隱藏多餘資訊的原則
定義類:
1 >>> class Person():2 def setName(self,name):3 self.name = name4 def getName(self):5 return self.name6 def greet(self):7 print ‘hello i am %s‘ % self.name
self : 是對對象自身的引用,是 方法(更專業點的可稱為 Binder 方法) 和 函數的區別
1 >>> foo = Person()2 >>> bar = Person()3 >>> foo.setName(‘zhang‘)4 >>> bar.setName(‘di‘)5 >>> foo.greet()6 hello i am zhang7 >>> bar.greet()8 hello i am di
特性可以在外部存取
1 >>> foo.name2 ‘zhang‘3 >>> bar.name4 ‘di‘5 >>> bar.name = ‘lu‘6 >>> bar.greet()7 hello i am lu
私人方法,類外部不可調用,內部可調用,用 "__"開頭即可
1 class Service: 2 def __a(self): 3 print "you can‘t see me" 4 5 def b(self): 6 print "you can see me" 7 self.__a() 8 9 >>> s = Service()10 >>> s.__a()11 12 Traceback (most recent call last):13 File "<pyshell#29>", line 1, in <module>14 s.__a()15 AttributeError: Service instance has no attribute ‘__a‘16 >>> s.b()17 you can see me18 you can‘t see me
類的定義其實就是執行代碼塊
1 >>> class a:2 print "a is created"3 4 5 a is created
注意下面代碼的區別
1 >>> class MemberCount(): 2 members = 0 3 def init(self): 4 self.members += 1 5 7 >>> m1 = MemberCount() 8 >>> m1.init() 9 >>> m1.members10 111 >>> m2 = MemberCount()12 >>> m2.init()13 >>> m2.members14 115 >>> class MemberCount():16 members = 017 def init(self):18 MemberCount.members += 119 21 >>> m1 = MemberCount()22 >>> m1.init()23 >>> m1.members24 125 >>> m2 = MemberCount()26 >>> m2.init()27 >>> m2.members28 229 >>> m1.members30 2
指定超類
1 >>> class Filter: 2 def init(self): 3 self.blocked = [] 4 def filter(self,sequence): 5 return [x for x in sequence if x not in self.blocked] 6 7 8 >>> class SapmFilter(Filter): 9 def init(self):10 self.blocked = [‘SPAM‘]11 12 13 >>> s = SapmFilter()14 >>> s.init()15 >>> s.filter([‘SPAM‘,‘EFF‘,‘A‘,‘SPAM‘])
調查繼承 想要查看一個類是否是另一個類的子類 ,可以用 內建的 issubclass 函數
1 >>> issubclass(SapmFilter,Filter) 2 True 3 >>> issubclass(Filter,SapmFilter) 4 False 5 #查看已知類的父類 6 >>> SapmFilter.__bases__ 7 (<class __main__.Filter at 0x0299B0D8>,) 8 >>> s = SapmFilter() 9 #查看 對象是否是類的執行個體10 >>> isinstance(s,SapmFilter)11 True12 >>> isinstance(s,Filter)13 True14 >>> isinstance(s,str)15 False
多個超類 多重繼承 盡量少用,且如果一個方法如果從多個超類繼承(也就是兩個超類具有相同名字的不同方法),先繼承類中的方法會重寫後繼承類中的方法
1 >>> class A: 2 def aa(self): 3 print "this is a" 4 5 6 >>> class B: 7 def bb(self): 8 print "this is b" 9 10 11 >>> class c(A,B):12 pass13 14 >>> cc = c()15 16 17 >>> cc.aa()18 this is a19 >>> cc.bb()20 this is b21 22 >>> c.__bases__23 (<class __main__.A at 0x0299B148>, <class __main__.B at 0x0299B1B8>)
python學習6 -對象