關於類的定義

1.關於類的定義


   

class Account(object):
    
"一個簡單的類"
    account_type
="Basic"
    
def __init__(self,name,balance):
        
"初始化一個新的Account實例"
        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):
        
"返回當前餘額"
        
return self.balance

   其中,__init__函數就是Python中的構造函數。另外,balance這個變量是類實例的變量。

    另外,在python中類中定義成員函數一般第一個參數總是self,表示自已的實例,與C++中的this指針差不多,不過C++中的this指針是隱函於其中並全局可見的,而在Python中卻要作爲參數傳進去, 這是Python中定義類的另一個特點。 

    還有一個特點,在類的成員函數中,使用類中的另一個成員函數,前面必須要指定類名,如下:
   
 class Foo(object):
     
def bar(self):
         
print "bar!"
     
def spam(self):
         bar(self)     
# 錯誤,引發NameError, 可以是:self.bar
         Foo.bar(self) # 合法的



2.在類中聲時靜態方法並使用靜態方法

    要在類中使用靜態方法,需在類成員函數前面加上@staticmethod標記符,以表示下面的成員函數是靜態函數。使用靜態方法的好處是,不需要定義實例即可使用這個方法:另外,多個實例共享此靜態方法,如下:
   

class SimClass():
   @staticmethod
   def ShareStr():
      print "This is a static Method"


SimClass.ShareStr()   #使用靜態函數


3.類方法:

    類方法與普通的成員函數和靜態函數有不同之處,在接觸的語言中好像也沒見過這種語義,看它的定義:

    一個類方法就可以通過類或它的實例來調用的方法, 不管你是用類來調用這個方法還是類實例調用這個方法,該方法的第一個參數總是定義該方法的類對象。 
    記住:方法的第一個參數都是類對象而不是實例對象. 
    按照慣例,類方法的第一個形參被命名爲 cls. 任何時候定義類方法都不是必須的(類方法能實現的功能都可以通過定義一個普通函數來實現,只要這個函數接受一個類對象做爲參數就可以了). 
    定義類方法並使用類方法:

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

    也就是說,類方法並不是必須的,使用普通函數也可以實現類方法的功能。 

4.類的繼承
   

在python中,繼承一個類,就像這樣:
    class A(object)  #繼承object類
            #.......
    class B(A)         #繼承A類
            #........

另外,python中支持多繼承,對於多繼承,找某個對應的函數,其python有相應的方法,如:
   
 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"

    如果我要調用A.method1() ,會出現什麼結果?答案是ClassB:method1. 書上是隻樣介紹的:
當搜索在基 類中定義的某個屬性時,Python採用深度優先的原則、按照子類定義中的基類順序進行搜索。**注意**(new-style類已經改變了這種行爲)。 上邊例子中,如果訪問 A.varB ,就會按照A-B-D-C-D這個順序進行搜索,只要找到就停止搜索.若有多個基類定義同一屬性的情況,則只使用第 一個被找到屬性值: 


5.數據隱藏

在python中實現數據隱藏很簡單,不需要在前面加什麼關鍵字,只要把類變量名或成員函數前面加兩個下劃線即可實現數據隱藏的功能,這樣,對於類 的實例來說,其變量名和成員函數是不能使用的,對於其類的繼承類來說,也是隱藏的,這樣,其繼承類可以定義其一模一樣的變量名或成員函數名,而不會引起命 名衝突。

 class A:
       
def __init__(self):
          self.
__X = 3        # self._A__X
    
    
class B(A):
       
def __init__(self):
          A.
__init__(self)
          self.
__X = 37       # self._B__X
發佈了5 篇原創文章 · 獲贊 6 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章