python中類別和類型詳解

高洛峰
發布: 2017-03-07 16:41:52
原創
1358 人瀏覽過

類別是什麼

可以視為種類或類型的同義詞。所有的物件都屬於某一個類,稱為類的實例。

例如:鳥就是"鳥類"的實例。這就是一個有很多子類的一般(抽象)類別:看到的鳥可能屬於子類"百靈鳥"。可以將"鳥類"想像成所有鳥的集合,而"百靈鳥類"是其中的一個子集。當一個物件所屬的類是另外一個物件所屬類的子集時,前者就被稱為後者的子類,所以"百靈鳥類"是"鳥類"的子類,"鳥類"是"百靈鳥類"的超類別

定義子類別只是定義更多方法的過程

建立類別

>>> class Person: def setName(self,name): self.name=name def getName(self): return self.name def greet(self): print "Hello,world! I'm %s" % self.name >>> foo=Person() >>> bar=Person() >>> foo.setName('Nsds') >>> bar.setName('Ysdy') >>> foo.greet() Hello,world! I'm Nsds >>> bar.greet() Hello,world! I'm Ysdy
登入後複製

在呼叫foo的setName和greet函數時,foo會自動將自己作為第一個參數傳入函數中,因此命名為self。沒有self的話,成員方法就沒辦法存取他們要對其特性進行操作的物件本身了

特性是可以外部存取的:

>>> foo.name 'Nsds' >>> bar.name='Yoda' >>> bar.greet() Hello,world! I'm Yoda
登入後複製

特性、函數、方法

self參數事實上正是方法和函數的差異。方法將它們的第一個參數綁定到所屬的實例上,因此這個參數可以不必提供。所以可以將特性綁定到一個普通函數上,這樣就不會有特殊的self參數了:

(特性是物件內部的變量,物件的狀態由它的特性來描述,物件的方法可以改變它的特性,可以直接從物件外部存取特性)

>>> class Class: def method(self): print 'I have a self!' >>> def function(): print "I don't..." >>> s=Class() >>> s.method() I have a self! >>> s.method=function >>> s.method() I don't...
登入後複製

變數birdsong引用綁定方法bird.sing上,還是對self參數的訪問(仍舊綁定到類別的相同實例上)

>>> class Bird: song='Squaawk' def sing(self): print self.song >>> bird=Bird() >>> bird.sing() Squaawk >>> birdsong=bird.sing >>> birdsong() Squaawk
登入後複製

在名稱前加上雙下劃線,可以讓方法或特性變成私有(從外部無法訪問)

>>> class Secretive: def __inaccessible(self): print "Bet you can't see me..." def accessible(self): print "The secret message is:" self.__inaccessible() >>> s=Secretive() >>> s.__inacessible() Traceback (most recent call last): File "", line 1, in  s.__inacessible() AttributeError: 'Secretive' object has no attribute '__inacessible' >>> s.accessible() The secret message is: Bet you can't see me...
登入後複製

在類別的內部定義中,所有以雙下劃線開的名字都被"翻譯"成前面加上單下劃線和類別名的形式

>>> Secretive._Secretive__inaccessible >>> s._Secretive__inaccessible() Bet you can't see me...
登入後複製

類別的命名空間

# 定義類別時,所有位於class語句中的程式碼都在特殊的命名空間中執行- --類別的命名空間。這個命名空間可由類別內所有成員存取。

類別的定義其實就是執行程式碼區塊

>>> class MemberCounter: members=0 def init(self): MemberCounter.members+=1 >>> m1=MemberCounter() >>> m1.init() >>> m1.members >>> m1.members=2 >>> m1.members >>> m2=MemberCounter() >>> m2.init() >>> m2.members >>> m2.init() >>> m2.members >>> m1.members >>>
登入後複製

新members值寫到了m1的特性中,屏蔽了類別範圍內的變數

超類別

>>> class Filter: def init(self): self.blocked=[] def filter(self,sequence): return [x for x in sequence if x not in self.blocked] >>> class SPAMFilter(Filter): def init(self): self.blocked=['SPAM'] >>> f=Filter() >>> f.init() >>> f.filter([1,2,3]) [1, 2, 3] >>> s=SPAMFilter() >>> s.init() >>> s.filter(['SPAM','SPAM','egg','name','ff']) ['egg', 'name', 'ff']
登入後複製

繼承,超類別

>>> class Filter: def init(self): self.blockes=[] def filter(self,sequence): return [x for x in sequence if x not in self.blocked] >>> class S(Filter): def init(self): self.blocked=['s'] >>> f=Filter() >>> f.init() >>> f.filter([1,2,3])
登入後複製

多個超類別

先繼承的類別中的方法會重寫後繼承的類別中的方法

>>> class C(): def calculate(self,expression): self.value=eval(expression) >>> class Talker(): def talk(self): print 'Hi,my value is',self.value >>> class TalkingCalculator(C,Talker): pass >>> tc=TalkingCalculator() >>> tc.calculate('1+2*3') >>> tc.talk() Hi,my value is 7
登入後複製

更多python中類別和類型詳解相關文章請關注PHP中文網!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!