裝飾器是什么?
定義:裝飾器是用于拓展原函數功能的一種語法,返回新函數替換舊函數
作用:在不更改原函數代碼的前提下,拓展出新功能
@語法:加上@符 系統會自動把下面的函數當成參數傳遞到裝飾器中,從下到上.
@符又被稱作語法糖
裝飾器:
1.普通裝飾器
def decor(func):
def inner():
print(“財務拿錢買貨”)
func()
print(“賣貨的錢還回來”)
return inner
@decor #效果等同于sell=decor(sell)
def sell():
print(“買到貨出去賣”)
sell()
2.裝飾帶有參數的函數
def decor(func):
def inner(*val1,**val2):
print(“財務拿錢買貨”)
func(*val1,**val2)
print(“賣貨的錢還回來”)
return inner
@decor
def sell(*val1,**val2):
for i,j in val2.items():
print(“賣的貨里面有{}”.format(val1),‘它們的類型有{}’.format(i),“價格在{}”.format(j))
sell(“布娃娃”,“洋娃娃”,“金剛芭比”,可愛型=“100元”,冷酷型=“200元”)
3.裝飾帶有返回值的函數
def decor(func):
def inner():
print(“財務拿錢買貨”)
res=func()#接收sell函數里的返回值"賣布娃娃"
print(“賣貨的錢還回來”)
return res #將"賣布娃娃""作為返回值
return inner
@decor #效果等同于sell=decor(sell)
def sell():
print(“買到貨出去賣”)
return “賣布娃娃”
res=sell()
print(res)#打印返回值
4.帶有參數的裝飾器(不同函數不同效果)
def out(name): # 這個只是一個接收name參數的殼子,因為decor(func)已經有一個參數了
def decor(func):
def inner():
func()
if name == ‘屌絲’:
print(“老娘沒空鳥你”)
if name == “富帥”:
print(“在的呢,有空有空”)
return inner
return decor
@out(“屌絲”)
def diaosi():
print(“女神有空嗎”)
diaosi()
@out(“富帥”)
def fushuai():
print(“有空嗎”)
fushuai()
多個裝飾器同時出現的情況,執行順序是什么樣的呢?
多個裝飾器的調用順序是自下往上,但是運行時的執行順序是自上往下
def decor1(func):
def inner():
print(“一號技師”)
func()
print(“一號技師結束”)
return inner
def decor2(func):
def inner():
print(“二號技師”)
func()
print(“二號技師結束”)
return inner
@decor1
@decor2
def mashaji():
print(“馬殺雞真舒服”)
mashaji()
#結果為
一號技師
二號技師
馬殺雞真舒服
二號技師結束
一號技師結束
#自下而上,mashaji函數先被decor2裝飾器裝飾成新的函數即(decor2中的inner函數),新的函數再被傳到decor1裝飾器裝飾成更新的函數.
def decor1(func):
def inner(func2):
print(“一號技師”)
res=func(func2)
print(“一號技師結束”)
return(res)
return inner
@decor1
def decor2(func):
print(“一號技師技術真好”)
def inner2():
print(“二號技師”)
func()
print(“二號技師結束”)
return inner2
@decor2
def mashaji():
print(“馬殺雞真舒服”)
mashaji()
#結果
一號技師
一號技師技術真好
一號技師結束
二號技師
馬殺雞真舒服
二號技師結束
#1.代碼怎么樣不報錯:decor2先被decor1修飾器修飾,decor2(func)作為參數傳入decor1的func中,將decor2(func)視作普通的有參數的被裝飾函數,則decor1中的inner()和func()需要補對應的參數進去.又decor2(func)在decor1的func(func2)中被執行,返回值為inner2,在decor1中用res去接收返回值并作為decor1中的返回值.
2.執行順序問題,因decor2調入decor1時inner2只是一個返回值未輸出.所以只有等mashaji()調入decor2時才會輸出.
5.把類作為裝飾器(后面講)
6.裝飾類(后面講)
面向過程: Procedure Oriented
一種以過程為中心的編程思想。
就是分析出解決問題所需要的步驟,然后用函數把這些步驟一步一步實現,使用的時候一個一個依次調用就可以了。
面向對象:Object Oriented 簡稱OO
一種以事物為中心的編程思想。
是把構成問題事務分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。
換句話來說,面向對象是以功能來劃分問題,而不是步驟。
面向對象的學習: 面向對象的語法的學習 面對對象的思想的學習
面向對象的優勢: 能夠實現良好程序結構,方便程序的開發和管理維護!
效率:
運行效率:計算機 面向對象效率不如過程化的快
開發效率:程序員 面向對象比過程話開發要方便的多。 方便了程序員!
面向對象和面過程開發的區別:
【面向過程】:
吃飯 -> 自己做飯吃(調用做飯函數)
喝水 -> 自己倒水喝(調用了倒水函數)
洗衣服-> 自己洗衣服(調用了洗衣服函數)
睡覺 -> 自己拿睡衣(調用了拿睡衣的函數)
去公司-> 走路去(調用走路函數)
去海南-> 走路去(調用走路函數)
送禮 -> 帶著禮物走去(調用走路運貨函數)
....
【面向對象】:
女朋友:
做飯功能
倒水功能
洗衣服功能
拿睡衣功能
吃飯了-> 女朋友,你給我做飯,謝謝
渴了 -> 女朋友,你給我倒一杯水,謝謝
洗衣服-> 女朋友,幫我把衣服洗一洗
....
汽車:
運動功能
運貨功能
兜風功能
...
去公司-> 汽車的運動功能…
去海南-> 汽車的運動功能或者兜風功能
送禮 -> 汽車的運貨功能
…
面向對象的結構特色:
高內聚(具有關聯的功能,總結在一個結構當中)
低耦合(沒有關聯的功能,放在不同的結構中)
面向的對象的單詞:
OO 面向對象
OOP 面向對象的開發 Object Oriented Programming
OOA 面向對象的分析 Object Oriented Analysis
OOD 面向對象的設計 Object Oriented Design
OOI 面向對象的實現 Object Oriented Implementation
OOA->OOD->OOI 面向對象程序開發的順序(OOP)
學習面向對象離不開兩個概念:類和對象
類:【類就是抽象的概念而已,(唯心主義)】
男人就是一個類
女人也是一個類
人類也是一個類
鳥類也是一個類
瓶子也是一個類
凳子也是一個類
…
以上內容都是一個簡單的名詞概念(語文)
【1.類是一個實物特征的集合,是一個抽象的名詞概念。】
開車是一個類 (打火,掛擋,離合,加油門,走你~)
打人也是一個類 (脫掉上衣,拿起磚頭,扔,趕快跑~)
做蛋糕是一個類 (和面,發酵,烘烤,切形狀…抹奶油,放水果,打包~)
…
以上內容都是一個動詞(語文)
【2.沒有具體實施的行為也是一個類,抽象的概念,存在與腦海中】
對象:【對象是具體的實物或者行為,(唯物主義)】
明星林志玲這個美女 就是一個對象
小豬佩奇這個角色 也是一個對象
我手上這臺電腦 也是一個對象
我現在坐著的這個凳子 也是一個對象
…
【1.對象是真真正正存在的實物,你看得見摸得著,不需要想象。】
我昨天開車去菜市場 就是一個對象
剛剛去做了個拉皮 也是一個對象
我給姐姐做了的生日蛋糕 這是一個對象
【2.真實發生過的行為就是對象,不需要想像,因為真的做了】
類和對象的關系:
都是面向對象開發中必不可少的內容。
1.類是由對象總結而來的。這個過程叫做抽象化
2.對象是由類具體實施而來。這個過程叫做實例化
創建文件:
習慣使用小寫字母當作文件名,可以使用下劃線進行分割。
類名的書寫規范:
使用駝峰命名法,
大駝峰: MyCar XiaoBaiTu…
小駝峰: myCar xiaoBaiTu…
類的組成:
女朋友:(類)
特征:性別女,膚白,貌美,大長腿…
sex = “女”
color = “皮膚白”
face = “貌美”
leg = “大長腿”
…
功能:洗衣,做飯,打掃衛生,陪…
def wash():
洗衣功能
def cook():
做飯功能
def clean():
打掃衛生功能
...
類中內容只有2個:屬性和方法
屬性:用于描述特征的變量->成員屬性
方法:用于描述功能的函數->成員方法
也有一種說法:類中只有屬性
類的書寫規則:
1.聲明一個類必須使用class關鍵字
2.類名的聲明需要符合駝峰命名法(推薦)
3.類中只能存在兩種內容:屬性和方法,除此之外不允許出現其他內容
4.聲明成員屬性的時候,變量必須賦值
5.聲明成員方法的時候,按照函數聲明規范即可(參數中會自動添加self參數)
實例化對象:
對象變量 = 類名()
spl = GirlFriend()
python中有無數個數據類型,本質上所有的數據類型都是一個類
print(GirlFriend)
print(type(1))
print(type(GirlFriend()))
print(GirlFriend()) 只有這個輸出的是對象
獲取類和對象中所屬成員的信息
類:類名.
dict
對象:對象名.
dict
類成員的操作:(少用)
成員屬性:(和變量一樣)
訪問 類名.成員屬性名
修改 類名.成員屬性名 = 新值
刪除 del 類名.成員屬性名
添加 類名.成員屬性名 = 值
class Car():
wheel = 4
car_door = 4
color = “多種多樣”
def move(self):
print(“小汽車開起來,嘟嘟嘟”)
def load(self):
print(“一個車里有北京和上海的所有學員”)
car=Car() #實例化對象
print(Car.wheel) #使用類訪問成員屬性
print(Car.
dict
)#查看類的信息
Car.wheel=“黃色” #修改類的成員屬性
print(Car.
dict
)
del Car.wheel #刪除類的成員屬性
print(Car.
dict
)
Car.name=“奔馳”
print(Car.
dict
)
成員方法
訪問 類名.方法名(參數)
修改 類名.方法名 = 新的函數 (不要加括號)(注意:僅限了解,不推薦使用)
刪除 del 類名.方法名 (不要加括號)
添加 類名.新方法名 = 函數(也可以是lambda表達式)(注意:僅限了解,不推薦使用)
class Car():
wheel = 4
car_door = 4
color = “多種多樣”
def move(self):
print(“小汽車開起來,嘟嘟嘟”)
def load(self):
print(“一個車里有北京和上海的所有學員”)
Car.move(1)
print(Car.
dict
)
Car.move=lambda x:print(“我愛小汽車”)
print(Car.
dict
)
del Car.load
print(Car.
dict
)
Car.love=lambda x:print(“奔馳我要定了”)
print(Car.
dict
)
對象成員的操作:
成員屬性:
訪問 對象.成員屬性名
修改 對象.新成員屬性名 = 新值
添加 對象.成員屬性名 = 值
刪除 del 對象.成員屬性名 (必須是屬于當前對象的成員才可以)
class Car():
wheel = 4
car_door = 4
color = “多種多樣”
def move(self):
print(“小汽車開起來,嘟嘟嘟”)
def load(self):
print(“一個車里有北京和上海的所有學員”)
car=Car()
print(car.wheel)
print(car.
dict
)
car.wheel=“黃色” #先給對象添加屬性
print(car.
dict
)
car.wheel=“白色” #修改對象的屬性
print(car.
dict
)
del car.wheel
print(car.
dict
)
car.name=“奔馳”
print(car.
dict
)
成員方法:
訪問 對象.成員方法名()
修改 對象.成員方法名 = 新的函數(不要加括號)
添加 對象.成員方法名 = 函數 (不要加括號)
刪除 del 對象.成員方法名 (不要加括號)
class Car():
wheel = 4
car_door = 4
color = “多種多樣”
def move(self):
print(“小汽車開起來,嘟嘟嘟”)
def load(self):
print(“一個車里有北京和上海的所有學員”)
car=Car()
car.move()
print(car.
dict
)
car.move=lambda x:print(“我愛小汽車”) #添加對象方法
print(car.
dict
)
car.move=lambda x:print(“奔馳我要定了”) #修改對象方法
print(car.
dict
)
del car.move #刪除對象方法
print(car.
dict
)
1.實例化對象的時候通常情況下類中的成員不會在對象中復制一份
2.訪問對象成員的時候,只要沒有該成員,對象會向實例化他的類查找。
3.對象成員的添加和修改,都只會影響當前對象本身,不會影響類和其他對象
4.刪除對象成員時候,必須是該對象自身的成員才可以刪除,不可以刪除類和其他對象~
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
