办公门户网站模板下载爱写作网站
2026/1/11 5:05:06 网站建设 项目流程
办公门户网站模板下载,爱写作网站,网站设计公司天津,安徽省建设行业安全协会网站Python 中的装饰器模式#xff08;Decorator Pattern#xff09; 装饰器模式是一种结构型设计模式#xff0c;其核心目的是#xff1a; 在不改变对象原有接口的情况下#xff0c;动态地给对象添加额外职责#xff08;功能#xff09;。 形象比喻#xff1a;就像给礼物…Python 中的装饰器模式Decorator Pattern装饰器模式是一种结构型设计模式其核心目的是在不改变对象原有接口的情况下动态地给对象添加额外职责功能。形象比喻就像给礼物包装层层彩纸每层包装都是一个“装饰”礼物本身不变但外观和功能增强了。装饰器模式的优点比继承更灵活可以运行时组合多个装饰符合开闭原则对扩展开放对修改关闭支持职责的动态添加和移除避免子类爆炸继承会导致类数量指数增长Python 中的特殊之处Python 语言本身内置了装饰器语法decorator这让装饰器模式在 Python 中实现得异常简洁和优雅甚至可以说是 Python 最常用的设计模式之一。我们分两种情况讲解函数装饰器最常见类/对象装饰器经典 GoF 装饰器模式1. 函数装饰器Python 最 Pythonic 的方式用于增强函数功能常用于日志、计时、权限检查、缓存等。importtimefromfunctoolsimportwraps# 装饰器记录函数执行时间deftimer(func):wraps(func)# 保留原函数的元信息如 __name__defwrapper(*args,**kwargs):starttime.time()resultfunc(*args,**kwargs)endtime.time()print(f{func.__name__}执行耗时:{end-start:.4f}秒)returnresultreturnwrapper# 装饰器打印日志deflogger(func):wraps(func)defwrapper(*args,**kwargs):print(f[{time.strftime(%Y-%m-%d %H:%M:%S)}] 调用{func.__name__}参数:{args},{kwargs})returnfunc(*args,**kwargs)returnwrapper# 使用装饰器支持多层装饰timerloggerdeffactorial(n:int)-int:ifn0:return1returnn*factorial(n-1)# 调用factorial(10)输出示例[2025-12-24 10:00:00] 调用 factorial参数: (10,), {} factorial 执行耗时: 0.0001 秒多层装饰顺序从下往上执行logger 先包裹再 timer。带参数的装饰器更高级defrepeat(times:int):defdecorator(func):wraps(func)defwrapper(*args,**kwargs):for_inrange(times):resultfunc(*args,**kwargs)returnresultreturnwrapperreturndecoratorrepeat(3)defgreet(name):print(fHello,{name}!)greet(Python)# 打印 3 次2. 类装饰器经典装饰器模式实现用于给对象动态添加职责更接近 GoF 原意。fromabcimportABC,abstractmethod# 组件接口ComponentclassCoffee(ABC):abstractmethoddefcost(self)-float:passabstractmethoddefdescription(self)-str:pass# 具体组件Concrete ComponentclassSimpleCoffee(Coffee):defcost(self)-float:return5.0defdescription(self)-str:returnSimple Coffee# 抽象装饰器DecoratorclassCoffeeDecorator(Coffee):def__init__(self,coffee:Coffee):self._coffeecoffeedefcost(self):returnself._coffee.cost()defdescription(self):returnself._coffee.description()# 具体装饰器加牛奶classMilkDecorator(CoffeeDecorator):defcost(self):returnself._coffee.cost()2.0defdescription(self):returnself._coffee.description(), Milk# 具体装饰器加糖classSugarDecorator(CoffeeDecorator):defcost(self):returnself._coffee.cost()0.5defdescription(self):returnself._coffee.description(), Sugar# 使用动态组合if__name____main__:coffeeSimpleCoffee()print(coffee.description(),coffee.cost())# Simple Coffee 5.0coffee_with_milkMilkDecorator(coffee)print(coffee_with_milk.description(),coffee_with_milk.cost())# Milk 7.0coffee_with_milk_and_sugarSugarDecorator(MilkDecorator(SimpleCoffee()))print(coffee_with_milk_and_sugar.description(),coffee_with_milk_and_sugar.cost())# Simple Coffee, Milk, Sugar 7.5这正是经典装饰器模式的结构装饰器持有被装饰对象调用时层层转发并添加行为。Python 中更简洁的类装饰器方式函数式Python 允许直接用函数装饰类defdataclass_like(cls):# 简单实现类似 dataclass 的 __repr__def__repr__(self):attrs, .join(f{k}{v!r}fork,vinself.__dict__.items())returnf{cls.__name__}({attrs})cls.__repr____repr__returnclsdataclass_likeclassPoint:def__init__(self,x,y):self.xx self.yy pPoint(1,2)print(p)# Point(x1, y2)装饰器模式 vs 其他模式对比模式目的是否改变接口适配器转换接口改变装饰器增强功能保持原接口不改变代理控制访问懒加载、权限等不改变组合静态组合对象-实际常见应用场景Web 框架如 Flask的app.route(/)Django 的login_required缓存lru_cachefunctools 内置日志、权限、事务、性能监控中间件系统如 FastAPI 的依赖注入注意事项装饰器顺序很重要多层时使用wraps保留原函数元信息过多装饰可能影响调试和性能类装饰器会影响继承和类型检查装饰器模式是 Python 中使用最频繁的设计模式之一掌握它能让你写出更优雅、更可维护的代码如果你想看更多实战例子如 Flask 路由装饰器实现、缓存装饰器、权限系统或者如何实现带状态的装饰器随时告诉我

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询