天天看點

Python 函數和類

python作為一個面向對象的語言,也有類似java等面向對象語言相同的資料結構(class)的定義,和代碼塊資料結構定義“函數”。為了極大可能的簡化代碼調用邏輯和書寫規則,python中對于函數和類的定義與使用也是及其簡單的。函數也可以稱作方法的定義使用有兩種:一種是通過關鍵字def定義函數格式,另一種是通過lambda建構一個匿名函數。類的定義主要是通過關鍵字class定義完成,具體類相關的内容會在下面總結.

Python 函數和類

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中的函數調用參數不需要指定類型,函數以”:”開始進行邏輯實作,函數頭部和函數體之間需要使用縮排來分割。上面的代碼給出了三種調用方式,正好反映了函數的三個調用特性(個人總結,說詞可能有點不太準确,但意思達到):

  1. 調用參數順序調用

一般的調用方式,也是較為常見的調用

  1. 指定參數名調用

python中調用函數可以通過指定參數的函數指定參數值來調用函數,如:

function(var2="var2",var1="var1") #這樣可以更加容易的了解參數對應的含義,前提得是個好名字.
           
  1. 選擇調用

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)不同。