Python装饰器的四种定义形式
admin
2024-02-14 06:21:22
0

前言

装饰器(decorator)在Python框架中扮演着重要角色,是Python中实现切面编程(AOP)的重要手段。

aspect-oriented programming (AOP) ,在不改变代码自身的前提下增加程序功能

不改变代码自身,但需要在函数和类头上加一个标注(annotation),这个标注在Python里叫装饰器,在java里叫注解。
在Python里,一共有四种组合形式。下面一一举例。

用函数装饰函数

采用一个函数定义装饰器:

def decorate(f):def wrapper(*args):return f(*args)*2return 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 = ndef __call__(self, fn):@wraps(fn)def wrapper(*args, **kwargs):result = fn(*args, **kwargs)return resultreturn wrapper

再作用在一个函数上:

@Star(5)
def add(a, b):return a + b

主要是在类中实现__call__方法。上面例子也可以简化:

class MyDecorator:def __init__(self, function):self.function = functiondef __call__(self, *args, **kwargs):# We can add some code# before function callself.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):passdef __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的内部机制会有更多的了解。如__init__, call, __new__等内置方法。

相关内容

热门资讯

麦芽安装安卓系统怎么安装,轻松... 你有没有想过,把安卓系统装到麦芽上,是不是就像给老式收音机配上蓝牙功能那么酷炫呢?想象你的麦芽设备瞬...
直板安卓系统手机游戏,直板安卓... 你有没有发现,最近手机游戏界又掀起了一股热潮?没错,就是那些让你一玩就停不下来的直板安卓系统手机游戏...
nolia是安卓系统吗,安卓系... 你有没有听说过Nolia这个操作系统?最近它在科技圈里可是小火了一把呢!很多人都在问,Nolia是安...
改善后的安卓系统,探索安卓系统... 你知道吗?最近安卓系统可是来了一次大变身,简直就像是换了个新灵魂一样! 作为一个紧跟科技潮流的数码达...
安卓系统小票机如何使用,轻松实... 你有没有想过,在繁忙的超市、商场或者餐厅,那些快速打印出小票的机器竟然是运行在安卓系统上的呢?没错,...
rm1090刷安卓系统 你有没有想过,给手机换个新系统,就像给它换了个新灵魂?今天,就让我带你一起探索如何用rm1090刷安...
369出行安卓系统,智慧导航新... 你有没有发现,最近出行软件界又掀起了一股热潮?没错,就是那个备受瞩目的369出行安卓系统!今天,就让...
韩国请假系统下载安卓版,享受便... 你知道吗?最近有个超级实用的韩国请假系统在咱们安卓用户中传得沸沸扬扬的!这个系统不仅操作简单,而且功...
支持安卓2.2系统的apk,兼... 你有没有想过,手机上的那些老古董应用,竟然还能在最新的安卓系统上运行?没错,就是那些支持安卓2.2系...
老款奥迪升级安卓系统 你有没有想过,你的老款奥迪也能焕发青春呢?没错,就是那个陪伴你走过风风雨雨的老伙计,现在有了升级安卓...
安卓系统只有英文翻译,Andr... 你知道吗?在咱们这个科技飞速发展的时代,手机已经成了我们生活中不可或缺的好伙伴。而说起手机,安卓系统...
安卓电视装苹果系统教程,轻松实... 亲爱的电视迷们,你是否曾梦想过在安卓电视上体验苹果系统的流畅与优雅?别再羡慕了,今天就来手把手教你如...
安卓系统换电池的方法 手机用久了,电池续航能力大不如前,是不是你也想给安卓手机来个“换血重生”呢?别急,今天就来手把手教你...
流量卡怎么解决安卓系统,高效使... 你是不是也遇到了这样的烦恼?手机流量不够用,但又不想每个月花大价钱买套餐?别急,今天就来给你支个招,...
dx80刷安卓系统 你有没有想过,给你的dx80手机换换口味呢?没错,就是那个一直默默陪伴你的dx80,今天咱们就来聊聊...
车载安卓系统安吉星卸载,轻松优... 你有没有发现,现在很多车载系统都开始流行起安卓系统了呢?尤其是安吉星,这个在汽车界小有名气的车载系统...
安卓手机系统ios系统升级,全... 你有没有发现,最近你的安卓手机又闹腾起来啦?没错,我又要来跟你聊聊这个让人又爱又恨的话题——安卓手机...
安卓系统7.0功略,深度解析全... 你有没有发现,你的安卓手机最近是不是变得有点儿不一样了?没错,它升级到了安卓系统7.0!这可不是一个...
安卓系统最新价格表,全面解析升... 你有没有发现,最近安卓系统的价格表又有了新变化?没错,这个话题可是让不少手机控们兴奋不已呢!今天,就...
安卓11q1系统,新特性与升级... 你知道吗?最近安卓系统又来了一次大更新,那就是安卓11Q1系统。这可不是一个小打小闹的更新,它可是带...