首先就是裝飾器的裝飾和呼叫,直接上**
'''
1.首先裝飾器的裝飾順序是從下往上進行裝飾
2.呼叫的時候要從上往下進行呼叫
'''# 舉例:
def w1(func):
print("---正在裝飾1---")
def inner():
print("---正在呼叫1---")
func()
return inner
def w2(func):
print("---正在裝飾2---")
def inner():
print("---正在呼叫2---")
func()
return inner
@w1@w2
def test():
print("---正在呼叫3---")
test()
執行結果:
---正在裝飾2---
---正在裝飾1---
---正在呼叫1---
---正在呼叫2---
---正在呼叫3---
從結果可以看出裝飾器的裝飾順序還有呼叫的順序
接下來是用裝飾器裝飾無引數和有引數的函式
'''
1.要注意的是有引數的函式進行裝飾時,要把引數傳進去之後再傳出來
2.多個引數用*args(tuple),**kwargs(dictionary)
3.*args和**kwargs在作為實參使用時需要進行解包
'''# 舉例:
def w1(functionname):
def func_in(*args,**kwargs):
print("正在呼叫1...")
functionname(*args,**kwargs)
print("正在呼叫2...")
return func_in
@w1def test1(a,b):
print("a + b = " + str(a + b))
@w1def test2(a,b,c):
print("a+b+c = " + str(a + b + c))
test1(11,22)
test2(11,22,33)
執行結果:
正在呼叫1...
a + b = 33
正在呼叫2...
正在呼叫1...
a+b+c = 66
正在呼叫2...
test1和test2在呼叫的時候會指向func_in函式,而functionname則是指向原來的test1和test2,functionname指向的函式可以永久儲存(閉包的特點)
def test1上面的@w1的**其實就相當於
test1 = w1(test1)
接著是裝飾器來裝飾有返回值的函式
'''
有返回值的函式和無返回值的函式類似,只是在中間需要通過乙個引數來進行傳遞返回值
'''# 舉例:(偷個懶,直接搬前面的**進行小小的改動)
def w1(functionname):
def func_in(*args,**kwargs):
print("正在呼叫1...")
ret = functionname(*args,**kwargs) # 在這裡我們需要乙個變數進行返回值的接收
print("正在呼叫2...")
return ret # 在這裡沒有返回值是不行的,最後結果會出錯
return func_in
@w1def test1(a,b):
return "a + b = " + str(a + b)
@w1def test2(a,b,c):
return "a+b+c = " + str(a + b + c)
ret1 = test1(11,22)
print(ret1)
ret2 = test2(11,22,33)
print(ret2)
執行結果:
正在呼叫1...
正在呼叫2...
a + b = 33
正在呼叫1...
正在呼叫2...
a+b+c = 66
還有一點是通用裝飾器,通用裝飾器與有返回值的裝飾器用法相同,所以就不放**啦。
如果是無返回值得函式,python會返回none
接著是帶有引數的裝飾器
'''
1.帶引數的裝飾器特點是可以對不同的函式進行不同的裝飾,達到分門別類的效果
2.帶引數的裝飾器原理是在普通裝飾器的外部再定義乙個函式來進行傳遞引數,然後返回內部函式的乙個引用進行裝飾
'''# 舉例:
def func_external(arg = "hello,world"):
print("---1---") #在裝飾器進行裝飾時進行呼叫
def func(functionname):
print("---2---") #在裝飾器進行裝飾時進行呼叫
def func_in(*args,**kwargs):
if arg == "hello,world": #這裡實現了帶參裝飾器的作用
print("---3---")
functionname(*args,**kwargs)
functionname(*args,**kwargs)
else:
print("---4---")
functionname(*args,**kwargs)
return func_in
return func
@func_external()
def test1(a,b):
print("a+b= " + str(a+b))
@func_external("what")
def test2(a,b,c):
print("a+b+c= " + str(a+b+c))
test1(11,22)
test2(11,22,33)
執行結果:
---1---
---2---
---1---
---2---
---3---
a+b= 33
a+b= 33
---4---
a+b+c= 66
通過分析就可以看出函式呼叫的順序
接下來是變數的作用域的問題
遵循legb規則:locals->enclosing function->globals->builtins
從左到右作用域依次變大
python是一門動態語言,即可以在執行的過程中給類新增屬性和方法
'''
想要給例項物件新增方法,不可以和新增屬性一樣,而是要用到types.methodtype(function,instance)來新增
'''import types
class person:
def __init__(self,name,age):
self.name = name
self.age = age
p1 = person("angel",99)
p1.length = "168cm" # 給例項物件新增屬性
print("身高:" + p1.length)
def eat(self):
print("%s正在吃..."%self.name)
p1.eat = types.methodtype(eat,p1) # 給例項物件新增方法,在這裡等號前面可以是任意名稱,但是為了**的可讀性,我們要選擇適當的名稱
p1.eat()
#直接在類中新增靜態方法和類方法
@staticmethod
def printone():
print("one")
@classmethod
def printtwo(cls):
print("two")
person.one = printone
person.two = printtwo
person.one() # 通過類呼叫此方法
person.two()
p1.one() # 通過例項物件來呼叫此方法
p1.two()
執行結果:
身高:168cm
angel正在吃...
onetwo
onetwo
css div學習筆記第1天
1 一列固定寬度 layut 2 一列自適應寬度 layout 3 一列固定寬度居中 layout 說明 margin屬性用於控制物件的上 右 下 左四個方向的外邊距,當margin使用兩個引數時,第乙個引數表示上下邊距,第二個引數表示左右邊距。除了直接使用數值之外,margin還支援乙個值叫aut...
Linux學習筆記第1天
今天學習了linux的有關目錄的基本命令。ls 檢視當前目錄下的檔案和目錄 a檢視所有檔案和目錄,包括隱藏檔案。l檢視檔案的詳細資訊。d檢視目錄的詳細資訊,與 l一起使用。h轉換成方面人檢視的資訊 mkdir 建立目錄 p遞迴建立,可以建立新目錄的同時再建立乙個子目錄 mkdir root desk...
Python基礎學習(第1天)
第一課 1 用python寫乙個helloworld的小程式,直接在hello.py輸入 print hello world 2 還可以把hello.py寫成乙個可執行的指令碼,如下 usr bin env python print hello world 還需要給上面的 賦予可執行的許可權,如下 ...