python裝飾器與物件導向__python

來源:互聯網
上載者:User
裝飾器(裝飾器就是用來裝飾函數的函數)

普通的函數:

    def 函數名(形參):        # 變數名        函數體        return 變數|常量    print 函數名(實參)

裝飾器:

    def 函數名1(形參):       #此形參傳遞函數        def 函數名2(形參):            函數體            return 變數|常量        return 函數名  ##也就是函數2的地址

裝飾器的調用有兩種方法
1.@函數名1 #此方法作用在要使用的函數之上
2.函數=函數名1(函數) #此方法與上相同,方式不同,建議使用上面的
舉例:

def dtimer(fun):    def timer(*args):  # 高階函數       #args = (1,2,3,4)        start_time = time.time()        fun(*args)                      # args =(1,2,3,4), 解包*(1,2,3,4)        stop_time = time.time()        return "run %s" % (stop_time - start_time)    return timer  # 返回的是timer的地址,要執行該函數需要timer()@dtimer  # fun1 = dtimer(fun1)def fun1(*args):    print "in the fun1....."    print args    time.sleep(1)
匿名函數

lambda 形參 : 傳回值

主要作用於高階函數調用函數中使用,以減少代碼量,且不用定義函數名 物件導向編程

面向過程:所有的事情都要親曆親為
物件導向:建立一個對象,所有的事情交給對象去完成

物件導向的一些關鍵名詞

類 ===== 建房子的圖紙 (三室一廳,兩室一廳…….)
對象 ===== 實際建出來的房子(門牌號)
執行個體化 ==== 建造的過程(根據類來建立對象的過程)

class People(object):           # 類    def __init__(self,name,age):        # 建構函式        self.name = name               # 屬性        self.age = age    def eat(self):                      #方法        print " %s 正在吃辣條....." %(self.name)    def echo_self(self):        print selftianfeng =  People("田峰",18)     # 通過類執行個體化出來的對象print tianfengtianfeng.echo_self()        ##通過對象來調用方法

self系統建立出來的對象,我們執行個體化出來的對象,只是指向此對象的地址
訪問對象屬性的兩種方式:
1.self.name
2.tianfeng.name 物件導向的三個特性:封裝,繼承,多態

封裝:將所有的操作封裝到一個不被外界看到的整體中,只對外開放部分提供的功能
繼承:一個類可以繼承另一個類,包括所有的變數,內建函數。。。
多態:在繼承的前提下,可以自己編寫相關函數來替代繼承的函數,保持子類的獨立性
多繼承
- python的類可以繼承多個,Java和C#只能單繼承;
- 繼承多個類,有兩種演算法:深度優先演算法和廣度優先演算法;
- 類為經典類(class C:)時,多繼承時使用深度優先演算法;
- 類為新式類(class C(C1,C2))時,多繼承時使用廣度優先演算法;
eg: D, C(D), B(D), A(B,C)
-深度優先:A->B->D->C
-廣度優先: A->B->C->D 類的私人屬性

當我們的類中存在一些不想被別人訪問和修改的屬性時,
我們可以將此屬性變為私人屬性
-建立方式:屬性前加兩個底線

class People(object):    def __init__(self, name, money):        self.name = name        self.__money = money  #此為私人屬性

私人屬性不能被訪問
私人屬性的實質:python內部將self._money給它重新命名為類名__money 類的方法

有些情況使我們不能建立類的對象,但我們還需要調用類的方法,
此時就需要建立類的方法,此方法可以使用類名來調用,而不用執行個體化對像
-建立方式:@classmethod標記類的方法關鍵字,並且傳回值為對象

 @classmethod       #類的方法關鍵字    def from_str(cls,s):      # class,類方法的第一個參數是類本身,cls = Date        year, month, day = map(int, s.split("-"))        d = cls(year,month,day)     # d = Date(year,month,day)        return d        # 對象 d1 = Date.from_str('2018-10-19')   #調用
類的靜態方法

靜態方法也可以直接使用類名調用
-建立方式:@staticmethod標記類的靜態方法關鍵字

    @staticmethod    def is_date_legal(s):      # 靜態方法,第一個參數既不是對象,也不是類本身,        year, month, day = map(int, s.split("-"))        return year >= 1970 and 0 < month <= 12 and 0 < day <= 31
類的私人屬性

-類的屬性,在記憶體中只需要儲存一次;
-在建構函式中的屬性,每執行個體化一個對象,就需要儲存一次;

class People(object):    country = "China"       #私人屬性    def __init__(self, name):   #建構函式中的屬性        self.name = name

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.