python设计模式之装饰器详解(三)

 python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式。

系列文章

装饰模式简介

  • 什么叫装饰?简单来说就是在已有的对象上添加格外的属性、方法或一段代码实现一个新的功能但是又不改变原来的对象或上下文的结构;这样做的意义在于为了是程序的设计符合开放-封闭原则,即对扩展开放,但是对修改封闭;也就是说一个类或方法被定义完成后就不要再去修改它了,你可以通过继承、装饰、代理等一些模式去扩展它的功能;最终的目的是为了降耦合和保证系统的稳定性。

python装饰模式的简单实现

class Car(object):     """     一个汽车类     """     def __init__(self):         self.logo = "奔驰" # 车标         self.oil = 2 # 油耗         self.ornamental = None # 装饰品      # 安装空调     def air_conditioner(self):         print("空调真舒服!")      def decorator(self, component):         """用来额外添加装饰方法的"""         self.ornamental = component  # 由于汽车的装饰品会发生变化 class Cushion(object):     """     坐垫     """     def __init__(self):         self.name = "席梦思"  class Flower(object):     """     装饰花     """     def __init__(self, name):         self.name = name  if __name__ == '__main__':     car = Car()     cushion = Cushion()     flower = Flower("玫瑰")     # 汽车添加一个坐垫     car.decorator(cushion)     print(car.ornamental)     # 添加一个花     car.decorator(flower)     print(car.ornamental)

上例中坐垫和花是可以为汽车动态添加的额外的属性,这样的话可以精简Car类的结构,同时可以扩展Car类的功能。

python的装饰器

  • python装饰器主要针对的是为一段已完成的方法增加额外的需要执行的代码,为了保持原来的方法不变,装饰器装饰后应该返回一个新的方法;实现这种功能需要一个载体,这个载体可以是函数也可以是类,同时python提供了语法糖@来完成装饰功能。

python装饰器实现原理介绍

@decorator def get_name():     pass

如上所示,当代码初始化加载上下文的时候,先定义get_name函数,decorator一定要在定义get_name函数之前加载到上下文中,解释器遇到@这种语法糖,会将@下的get_name函数作为参数代入decorator中执行decorator并返回新的方法,重新将返回的方法赋值给get_name。

那decorator究竟是什么结构呢?我们可以看装饰器的要求,需要返回一个新的方法,因此可以是闭包结构,也可以是类结构。

使用闭包结构的装饰器

def decorator

                    
                
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信