python函數裝飾器用法執行個體詳解

來源:互聯網
上載者:User

python函數裝飾器用法執行個體詳解

   本文執行個體講述了python函數裝飾器用法。分享給大家供大家參考。具體如下:

  裝飾器經常被用於有切面需求的情境,較為經典的有插入日誌、效能測試、交易處理等。裝飾器是解決這類問題的絕佳設計,

  有了裝飾器,我們就可以抽離出大量函數中與函數功能本身無關的雷同代碼並繼續重用。概括的講,裝飾器的作用就是為已經存在的對象添加額外的功能。

  ?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

#! coding=utf-8

import time

def timeit(func):

def wrapper(a):

start = time.clock()

func(1,2)

end =time.clock()

print 'used:', end - start

print a

return wrapper

@timeit

# foo = timeit(foo)完全等價,

# 使用之後,foo函數就變了,相當於是wrapper了

def foo(a,b):

pass

#不帶參數的裝飾器

# wraper 將fn進行裝飾,return wraper ,返回的wraper 就是裝飾之後的fn

def test(func):

def wraper():

print "test start"

func()

print "end start"

return wraper

@test

def foo():

print "in foo"

foo()

  輸出:

  ?

1

2

3

test start

in foo

end start

  裝飾器修飾帶參數的函數:

  ?

1

2

3

4

5

6

7

8

9

10

def parameter_test(func):

def wraper(a):

print "test start"

func(a)

print "end start"

return wraper

@parameter_test

def parameter_foo(a):

print "parameter_foo:"+a

#parameter_foo('hello')

  輸出:

  ?

1

2

3

4

>>>

test start

parameter_foo:hello

end start

  裝飾器修飾不確定參數個數的函數:

  ?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

def much_test(func):

def wraper(*args, **kwargs):

print "test start"

func(*args, **kwargs)

print "end start"

return wraper

@much_test

def much1(a):

print a

@much_test

def much2(a,b,c,d ):

print a,b,c,d

much1('a')

much2(1,2,3,4)

  輸出:

  ?

1

2

3

4

5

6

test start

a

end start

test start

1 2 3 4

end start

  帶參數的裝飾器,再包一層就可以了:

  ?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

def tp(name,age):

def much_test(func):

print 'in much_test'

def wraper(*args, **kwargs):

print "test start"

print str(name),'at:'+str(age)

func(*args, **kwargs)

print "end start"

return wraper

return much_test

@tp('one','10')

def tpTest(parameter):

print parameter

tpTest('python....')

  輸出:

  ?

1

2

3

4

5

in much_test

test start

one at:10

python....

end start

  ?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

class locker:

def __init__(self):

print("locker.__init__() should be not called.")

@staticmethod

def acquire():

print("locker.acquire() called.(這是靜態方法)")

@staticmethod

def release():

print("locker.release() called.(不需要對象執行個體")

def deco(cls):

'''cls 必須實現acquire和release靜態方法'''

def _deco(func):

def __deco():

print("before %s called [%s]." % (func.__name__, cls))

cls.acquire()

try:

return func()

finally:

cls.release()

return __deco

return _deco

@deco(locker)

def myfunc():

print(" myfunc() called.")

myfunc()

  輸出:

  ?

1

2

3

4

5

6

>>>

before myfunc called [__main__.locker].

locker.acquire() called.(這是靜態方法)

myfunc() called.

locker.release() called.(不需要對象執行個體

>>>

  ?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

class mylocker:

def __init__(self):

print("mylocker.__init__() called.")

@staticmethod

def acquire():

print("mylocker.acquire() called.")

@staticmethod

def unlock():

print(" mylocker.unlock() called.")

class lockerex(mylocker):

@staticmethod

def acquire():

print("lockerex.acquire() called.")

@staticmethod

def unlock():

print(" lockerex.unlock() called.")

def lockhelper(cls):

'''cls 必須實現acquire和release靜態方法'''

def _deco(func):

def __deco(*args, **kwargs):

print("before %s called." % func.__name__)

cls.acquire()

try:

return func(*args, **kwargs)

finally:

cls.unlock()

return __deco

return _deco

class example:

@lockhelper(mylocker)

def myfunc(self):

print(" myfunc() called.")

@lockhelper(mylocker)

@lockhelper(lockerex)

def myfunc2(self, a, b):

print(" myfunc2() called.")

return a + b

if __name__=="__main__":

a = example()

a.myfunc()

print(a.myfunc())

print(a.myfunc2(1, 2))

print(a.myfunc2(3, 4))

  輸出:

  ?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

before myfunc called.

mylocker.acquire() called.

myfunc() called.

mylocker.unlock() called.

before myfunc called.

mylocker.acquire() called.

myfunc() called.

mylocker.unlock() called.

None

before __deco called.

mylocker.acquire() called.

before myfunc2 called.

lockerex.acquire() called.

myfunc2() called.

lockerex.unlock() called.

mylocker.unlock() called.

3

before __deco called.

mylocker.acquire() called.

before myfunc2 called.

lockerex.acquire() called.

myfunc2() called.

lockerex.unlock() called.

mylocker.unlock() called.

7

  希望本文所述對大家的Python程式設計有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.