python作為一個面向對象的語言,也有類似java等面向對象語言相同的資料結構(class)的定義,和代碼塊資料結構定義“函數”。為了極大可能的簡化代碼調用邏輯和書寫規則,python中對于函數和類的定義與使用也是及其簡單的。函數也可以稱作方法的定義使用有兩種:一種是通過關鍵字def定義函數格式,另一種是通過lambda建構一個匿名函數。類的定義主要是通過關鍵字class定義完成,具體類相關的内容會在下面總結.
Python中的函數
python中函數的使用可以分為兩種,若仔細研究會發現還有一種類似類型(清單解析),但其更像一個表達式。如下一一總結:
- lambda
python中可以通過lambda表達式來建構一個簡單的單行匿名函數。其結構簡單,使用輕便,但功能也及其有限。其格式如下:
multi=lambda x,y:x*y #lambda關鍵字定義,以':'分割,左邊為參數清單,右邊為傳回結果的表達式
print multi(2,3)
如上為一個簡單的lambda形式建立的函數模式,可以通過其計算兩個數的積,對于這類較為簡單的計算可以直接使用lambda建立一個建議的函數實作。
而def定義的函數可以完成較為複雜的工作,其定義格式如下
#定義格式
def [function_name]([parameter list]):
'the function introduction' #注釋文檔,作為文檔說明使用
[statement] #縮進排版,确定代碼塊
#示例
def function(var1,var2="test"):
'only print parameter.'
print var1,var2
help(function)
function("need","help")
function(var2="var2",var1="var1")
function("var1")
#result
Help on function function in module __main__:
function(var1, var2='test')
only print parameter.
need help
var1 var2
var1 test
如上,給出了函數的定義格式和示例代碼,python中的函數調用參數不需要指定類型,函數以”:”開始進行邏輯實作,函數頭部和函數體之間需要使用縮排來分割。上面的代碼給出了三種調用方式,正好反映了函數的三個調用特性(個人總結,說詞可能有點不太準确,但意思達到):
- 調用參數順序調用
一般的調用方式,也是較為常見的調用
- 指定參數名調用
python中調用函數可以通過指定參數的函數指定參數值來調用函數,如:
function(var2="var2",var1="var1") #這樣可以更加容易的了解參數對應的含義,前提得是個好名字.
- 選擇調用
python方法中可以指定參數的預設值,若不需要修改參數值的話可以省略對該參數的調用,使用見上示例最後一個調用。
python中的類
python中的類和一般的面向對象語言沒什麼太大的差別,具有一般類的基本特性:封裝,抽象,多态,繼承 特性。和其他語言不同的是python中的類有兩種類型的類:新式類和舊式類,在python2.x中預設建立的類為舊式類,python3.x預設茶ungjian的是新式類。
類的定義
類的定義和函數類似,需要使用一個關鍵字“class”來定義,定義文法結構如下:
class className:
[statement]
如此就是一個類的定義,一個類中存在很多元素構成,如下為一個類的使用的示例,參考示例來了解類的成員類型:
class TestClass: #類的定義
DESCRIPTION = "class introduction" # 類變量,可直接通過類名調用
__test = "test" # 屬于私有,不可在類外部直接調用以“__”開頭
_single = "single" # 屬于私有,不可使用from module import *導入使用
def __init__(self,name):
'測試類' #注釋文檔
self.name=name #通過self可以建立類的執行個體變量
print TestClass.__test
print TestClass._single
def getName(self): #類的成員方法
return self.name
def __getName(self): #類的私有方法
return TestClass._single
@staticmethod
def getsingele(): #類的靜态方法
return TestClass.__test
print TestClass.DESCRIPTION
print TestClass.getsingele()
test=TestClass("hfcai")
print test.name
print test.getName()
print TestClass.getName(test)
#result
class introduction
test
test
single
hfcai
hfcai
hfcai
- 構造方法
執行個體化類(類的建立)需要通過調用其構造函數來執行個體化,python中的執行個體化會自動調用類的構造方法__init__(),可以通過指定__init__方法參數來執行個體化對象,同時需要注意的是一個類中隻能有一個__init__函數。
- 類的執行個體變量python 中的類的執行個體化對象的建立需要通過self來建立,執行個體化對象完成後也可以通過類的變量進行調用
- 類的執行個體方法類的執行個體方法和普通的python函數類似,唯一不同的是類的成員犯法的參數清單首個參數必須是self,該方法的調用可以通過類的執行個體直接調用,不需要對首個self進行傳遞,預設為執行個體本身,也可以通過類名直接調用,但需要給self傳值,參數為目前類的執行個體。
- 類的靜态方法類的靜态方法需要通過**@@staticmethod**定義,從次下一行開始定義方法(和函數相同).調用可以直接通過類名調用。
- 類的變量類似于java中的靜态變量,需要通過類名調用
需要注意的是類的私有熟悉,類中所有以” __ ” 開頭的方法、參數,均不可在類的外部直接調用,所有以“_ ” 開頭的方法、參數均不可使用
“from module import * ” 來直接調用.
新式類和舊式類
新式類是從python 2.2開始引入,python2.x預設建立的都是舊式類,python3.x預設建立的都是新式類。新式類是繼承自object,其功能是為了保證class和type的統一,使用執行個體的__class__屬性和type(執行個體)會傳回相同的結果,但舊式類不一定。新式類對于多重繼承的搜尋算法進行了修改。對于python2.x來說想要定義形式類可以通過如下兩種方法:
- 繼承object
直接顯式繼承自object可建立新式類
- metaclass = type
直接在類的聲明前添加“metaclass = type”
如下示例:
#!/usr/bin/env python
# -*-encoding:utf-8 -*-
class A: #舊式類
def __init__(self):
print "classic type."
class B(object): #新式類
def __init__(self):
print "new style type. one"
__metaclass__ =type
class C: #新式類
def __init__(self):
print "new style type. two"
a=A()
b=B()
c=C()
print "class A __class__:%s,type:%s \n"% (a.__class__,type(a))
print "class B __class__:%s,type:%s \n"% (b.__class__,type(b))
print "class C __class__:%s,type:%s \n"% (c.__class__,type(c))
#result
classic type.
new style type. one
new style type. two
class A __class__:__main__.A,type:<type 'instance'>
class B __class__:<class '__main__.B'>,type:<class '__main__.B'>
class C __class__:<class '__main__.C'>,type:<class '__main__.C'>
如上發現,隻有A的**class ** 和type(a)不同。