Python的類

2018-10-10 14:09 更新

1.關(guān)于類的定義

class Account(object): 
"一個(gè)簡(jiǎn)單的類" 
account_type="Basic" 
def init(self,name,balance): 
"初始化一個(gè)新的Account實(shí)例" 
self.name=name 
self.balance=balance 
def deposit(self,amt): 
"存款" 
self.balance=self.balance+amt 
def withdraw(self,amt): 
"取款" 
self.balance=self.balance-amt 
def inquiry(self): 
"返回當(dāng)前余額" 
return self.balance 
其中,init函數(shù)就是Python中的構(gòu)造函數(shù)。另外,balance這個(gè)變量是類實(shí)例的變量。
另外,在python中類中定義成員函數(shù)一般第一個(gè)參數(shù)總是self,表示自已的實(shí)例,與C++中的this指針差不多,不過(guò)C++中的this指針是隱函于其中并全局可見的,而在Python中卻要作為參數(shù)傳進(jìn)去, 這是Python中定義類的另一個(gè)特點(diǎn)。
還有一個(gè)特點(diǎn),在類的成員函數(shù)中,使用類中的另一個(gè)成員函數(shù),前面必須要指定類名,如下:
class Foo(object): 
def bar(self): 
print "bar!" 
def spam(self): 
bar(self) # 錯(cuò)誤,引發(fā)NameError, 可以是:self.bar 
Foo.bar(self) # 合法的 


2.在類中聲明靜態(tài)方法并使用靜態(tài)方法

要在類中使用靜態(tài)方法,需在類成員函數(shù)前面加上@staticmethod標(biāo)記符,以表示下面的成員函數(shù)是靜態(tài)函數(shù)。使用靜態(tài)方法的好處是,不需要定義實(shí)例即可使用這個(gè)方法:另外,多個(gè)實(shí)例共享此靜態(tài)方法,如下:
class SimClass(): 
@staticmethod 
def ShareStr(): 
print "This is a static Method" 
SimClass.ShareStr() #使用靜態(tài)函數(shù)


3.類方法:

類方法與普通的成員函數(shù)和靜態(tài)函數(shù)有不同之處,在接觸的語(yǔ)言中好像也沒見過(guò)這種語(yǔ)義,看它的定義:
一個(gè)類方法就可以通過(guò)類或它的實(shí)例來(lái)調(diào)用的方法, 不管你是用類來(lái)調(diào)用這個(gè)方法還是類實(shí)例調(diào)用這個(gè)方法,該方法的第一個(gè)參數(shù)總是定義該方法的類對(duì)象。
記住:方法的第一個(gè)參數(shù)都是類對(duì)象而不是實(shí)例對(duì)象.
按照慣例,類方法的第一個(gè)形參被命名為 cls. 任何時(shí)候定義類方法都不是必須的(類方法能實(shí)現(xiàn)的功能都可以通過(guò)定義一個(gè)普通函數(shù)來(lái)實(shí)現(xiàn),只要這個(gè)函數(shù)接受一個(gè)類對(duì)象做為參數(shù)就可以了).
定義類方法并使用類方法:
class ABase(object): 
@classmethod #類方法修飾符 
def aclassmet(cls): print 'a class method for', cls.name 
class ADeriv(ABase): pass 
bInstance = ABase( ) 
dInstance = ADeriv( ) 
ABase.aclassmet( ) # prints: a class method for ABase 
bInstance.aclassmet( ) # prints: a class method for ABase 
ADeriv.aclassmet( ) # prints: a class method for ADeriv 
dInstance.aclassmet( ) # prints: a class method for ADeriv 
也就是說(shuō),類方法并不是必須的,使用普通函數(shù)也可以實(shí)現(xiàn)類方法的功能。


4.類的繼承

在python中,繼承一個(gè)類,就像這樣:
class A(object) #繼承object類
#.......
class B(A) #繼承A類
#........
另外,python中支持多繼承,對(duì)于多繼承,找某個(gè)對(duì)應(yīng)的函數(shù),其python有相應(yīng)的方法,如:
class D(oject): pass #D繼承自object 
class B(D): #B是D的子類 
varB = 42 
def method1(self): 
print "Class B : method1" 
class C(D): #C也是D的子類 
varC = 37 
def method1(self): 
print "Class C : method1" 
def method2(self): 
print "Class C : method2" 
class A(B,C): #A是B和C的子類 
varA = 3.3 
def method3(self): 
print "Class A : method3"
如果我要調(diào)用A.method1() ,會(huì)出現(xiàn)什么結(jié)果?答案是ClassB:method1. 書上是這樣介紹的:
當(dāng)搜索在基類中定義的某個(gè)屬性時(shí),Python采用深度優(yōu)先的原則、按照子類定義中的基類順序進(jìn)行搜索。注意(new-style類已經(jīng)改變了這種行為)。上邊例子中,如果訪問(wèn) A.varB ,就會(huì)按照A-B-D-C-D這個(gè)順序進(jìn)行搜索,只要找到就停止搜索.若有多個(gè)基類定義同一屬性的情況,則只使用第一個(gè)被找到屬性值:


5.數(shù)據(jù)隱藏

在python中實(shí)現(xiàn)數(shù)據(jù)隱藏很簡(jiǎn)單,不需要在前面加什么關(guān)鍵字,只要把類變量名或成員函數(shù)前面加兩個(gè)下劃線即可實(shí)現(xiàn)數(shù)據(jù)隱藏的功能,這樣,對(duì)于類的實(shí)例來(lái)說(shuō),其變量名和成員函數(shù)是不能使用的,對(duì)于其類的繼承類來(lái)說(shuō),也是隱藏的,這樣,其繼承類可以定義其一模一樣的變量名或成員函數(shù)名,而不會(huì)引起命名沖突。
class A: 
def init(self): 
self.X = 3 # self._AX 
class B(A): 
def init(self): 
A.init(self) 
self.X = 37 # self._BX

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)