您好,登錄后才能下訂單哦!
這篇文章主要講解了“Python裝飾器的定義形式有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Python裝飾器的定義形式有哪些”吧!
裝飾器(decorator)在Python框架中扮演著重要角色,是Python中實現切面編程(AOP)的重要手段。
aspect-oriented programming (AOP) ,在不改變代碼自身的前提下增加程序功能
不改變代碼自身,但需要在函數和類頭上加一個標注(annotation),這個標注在Python里叫裝飾器,在java里叫注解。
在Python里,一共有四種組合形式。下面一一舉例。
采用一個函數定義裝飾器:
def decorate(f): def wrapper(*args): return f(*args)*2 return wrapper
然后作用在一個函數上:
@decorate def add(a, b): return a + b
測試一下效果:
def test_decorate(): sum = add(3, 5) assert sum == 16
這里通過裝飾器實現單例模式:
def singleton(cls): instances = {} def wrapper(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return wrapper
使用該裝飾器:
@singleton class MyClass: def method(self): pass
于是,當你定義多個對象時,返回的是同一實例:
obj = MyClass() # creates a new instance obj2 = MyClass() # returns the same instance obj3 = MyClass() # returns the same instance ...
先采用類定義一個裝飾器:
class Star: def __init__(self, n): self.n = n def __call__(self, fn): @wraps(fn) def wrapper(*args, **kwargs): result = fn(*args, **kwargs) return result return wrapper
再作用在一個函數上:
@Star(5) def add(a, b): return a + b
主要是在類中實現__call__方法。上面例子也可以簡化:
class MyDecorator: def __init__(self, function): self.function = function def __call__(self, *args, **kwargs): # We can add some code # before function call self.function(*args, **kwargs) # We can also add some code # after function call. # adding class decorator to the function @MyDecorator def function(name, message ='Hello'): print("{}, {}".format(message, name))
先定義裝飾器:
class MyClassDecorator(object): _instances = dict() def __init__(self, name): pass def __call__(self, cls): class WrappedClass(cls): def say_hello(self): print(f'Hello: {self.username}') return WrappedClass
該裝飾器給被裝飾的類上添加了一個方法,名稱為say_hello()。使用如下:
@MyClassDecorator('test') class MyClass(): def __init__(self, username): self.username = username
然后:
def test_decoratorforclass(): obj = MyClass('user1') obj.say_hello()
打印出: Hello: user1
感謝各位的閱讀,以上就是“Python裝飾器的定義形式有哪些”的內容了,經過本文的學習后,相信大家對Python裝飾器的定義形式有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。