裝飾器(裝飾器就是用來裝飾函數的函數)
普通的函數:
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