1. 程式人生 > >Python中的面向物件程式設計詳解

Python中的面向物件程式設計詳解

本文講解了建立類、例項化類、類屬性、特殊方法內建屬性、靜態變數屬性、例項變數屬性、方法屬性、靜態方法、類方法等內容。
建立類:Python中,使用 class 關鍵字來建立一個類。簡單的類的宣告可以是關鍵字後緊跟類名。
例項化:類名後跟一對圓括號例項化一個類。
類屬性
python的屬性與Java和C++等面嚮物件語言不同,python的屬性既包括了資料成員還包括函式元素,通過句點符號來訪問。
特殊資料內建屬性
C.name 類C的名字(字串)
C.doc 類C的文件字串
C.bases 類C的所有父類構成的元組
C.dict 類C的屬性
C.module 類C定義所在的模組(1.5 版本新增)
c.class

例項c對應的類

特殊方法內建屬性
dir():獲得類屬性或者例項屬性名字列表.
靜態變數屬性(也稱為類變數):直接在class作用域定義(在函式外定義)
動態變數屬性(也稱為例項變數):python的例項屬性與Java和C++等不同.在Java和C++中,例項屬性必須首先宣告/定義,而python例項屬性是動態建立。
設定例項的屬性可以在例項建立後任意時間進行,也可以在能夠訪問例項的程式碼中進行。構造器init()是設定這些屬性的關鍵點之一。

def __init__(self, name, data):
    self.name = name
    self.data = "123'

注意:self類似Java的this關鍵字作用,它是一個指向自身例項的引用。。。
方法屬性:分為例項方法和類方法.例項方法只屬於一個例項;而類方法屬於類,也屬於例項.
靜態方法:靜態方法是類級別的方法,不需要例項化類就可以通過類名直接呼叫.有兩種方法定義:

#1》裝飾器(常用)
@staticmethod   
def foo():
    print 'call static method'
#2》內建函式
def foo():
    print 'call static method'
foo = staticmethod(foo) #靜態方法

類方法:類方法是類級別的方法, 與靜態方法不同的是,它必須顯示傳入cls類引數;
而且如果還需要呼叫類中其他的靜態方法,或者類方法, 要定義成類方法.類方法也有兩種方法定義:

#1》裝飾器(常用)
@classmethod    
def bar(cls):
    print 'call class method and access static varible(staticVar): ', cls.staticVar
#2》內建函式
def bar(cls):
    print 'call class method and access static varible(staticVar): ', cls.staticVar
bar = classmethod(bar)  #類方法

例項詳解(可以加很多斷點,在debug模式下,一步一步檢視程式的執行軌跡)

class Target(): #定義類Target
    'This is Target definition' #定義__doc__屬性
    staticVar = 'v1.0'  #定義靜態變數(類變數)
    def __init__(self, name = 'default', data = 0): #定義建構函式
        self.name = name    #例項變數
        self.data = data    #例項變數
        
    def main():
        print "this is a test function"
        
    #方法一:用裝飾器定義靜態方法
    @staticmethod   
    def func1():
        print 'call static method func1'
        
    def func2():
        print 'call static method func2'
    func2 = staticmethod(func2) #方法二:定義靜態方法
    
    #方法一:用裝飾器定義類方法
    @classmethod    
    def bar1(cls):
        print 'call class method bar1 and access static varible(staticVar):',cls.staticVar
         
    def bar2(cls):
        print 'call class method bar2 and access static varible(staticVar):',cls.staticVar
    bar2 = classmethod(bar2)  #方法二:定義類方法
 
    if __name__ == '__main__':
        main()
 
#例項化
target = Target('aaa', 123)
print 'name is: ', target.name
print 'data is: ', target.data
#列印__doc__屬性
print 'Target.__doc__ is: ', Target.__doc__
print 'target.__doc__ is: ', target.__doc__
#列印類__dict__屬性
print 'Target.__dict__ is: ', Target.__dict__
#列印例項__dict__屬性
print 'target.__dict__ is:',target.__dict__
#列印靜態變數
print 'staticVar is: ', Target.staticVar
#列印內建函式dir()
print 'dir(Target) is: ', dir(Target)
print 'dir(target) is: ', dir(target)
#呼叫靜態方法
Target.func1()
Target.func2()
#呼叫類方法
Target.bar1()
Target.bar2()

輸出:
this is a test function
name is: aaa
data is: 123
Target.doc is: This is Target definition
target.doc is: This is Target definition
Target.dict is: {‘bar1’: <classmethod object at 0x029EF390>, ‘func2’: <staticmethod object at 0x029EF370>, ‘module’: ‘main’, ‘bar2’: <classmethod object at 0x029EF3B0>, ‘func1’: <staticmethod object at 0x0298EB10>, ‘staticVar’: ‘v1.0’, ‘main’: <function main at 0x029E7D70>, ‘doc’: ‘This is Target definition’, ‘init’: <function init at 0x029E7D30>}
target.dict is: {‘data’: 123, ‘name’: ‘aaa’}
staticVar is: v1.0
dir(Target) is: [‘doc’, ‘init’, ‘module’, ‘bar1’, ‘bar2’, ‘func1’, ‘func2’, ‘main’, ‘staticVar’]
dir(target) is: [‘doc’, ‘init’, ‘module’, ‘bar1’, ‘bar2’, ‘data’, ‘func1’, ‘func2’, ‘main’, ‘name’, ‘staticVar’]
call static method func1
call static method func2
call class method bar1 and access static varible(staticVar): v1.0
call class method bar2 and access static varible(staticVar): v1.0