Python设计模式

第一章: 设计模式基础

第二章: 常用设计模式

首页 > Python设计模式 > 第二章: 常用设计模式 > 2.3节: 装饰器模式

2.3节: 装饰器模式

薯条老师 2021-09-27 16:03:50 214849 0

编辑 收藏

广州番禺Python, Java小班周末班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人,学员的平均就业薪资有11K。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Python量化投资,Python机器学习,Java中高级后端开发。授课详情请点击:http://chipscoco.com/?cate=6

2.3.1 装饰器模式

装饰器模式用来向一个已有的对象扩展功能,而不会改变其结构。Python中的函数装饰器,类装饰器使用的就是装饰器模式。

2.3.2 适用场景

Python中的装饰器主要用来扩展方法的功能,而不会修改方法的原有实现,非常符合设计模式中的开闭原则。现在举个简单的例子来帮助大家理解。在某web项目中定义了一个欢迎页面,一开始用户无需登录就可以进入欢迎页,该欢迎页对应的接口为welcome。随着项目的不断迭代,现在需要用户登录以后才弹出欢迎页。此时该如何为welcome接口进行扩展?有两种扩展方案:

(1) 直接对welcome接口进行修改,在接口内部对用户的登录态进行检查
(2) 不修改welcome接口,将对用户登录状态检查的代码使用装饰器来实现

采用第一种方案会改变welcome接口的代码逻辑,违背了开闭原则。而采用第二种方案,将扩展的逻辑转移到装饰器中,不会侵入原有的代码。关于Python装饰器的详细介绍,可参考这一节教程:彻底掌握装饰器

2.3.3 源码实现

通过函数装饰器来实现单例模式:

# __author__ = 薯条老师,微信公众号:薯条编程
"""
(1) 通过函数装饰器来实现单例
"""
# 装饰器的两层结构
def singleton(cls):
    instances = {}
    def get_instance(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    return get_instance
    
    
# 使用装饰器singleton来装饰Dog类
@singleton
class Dog:
    def __init__(self, name):
        self.__name = name
        
print(Dog("kitty") is Dog("Lisa"))

通过类装饰器来实现单例:

# __author__ = 薯条老师,微信公众号:薯条编程
"""
(1) 通过类装饰器来实现单例
"""
# 类装饰器的两层结构
class Singleton:
    def __init__(self,  cls):
        self.__cls = cls
        self.__instances = {}
        
        
    def __call__(self,  *args,  **kwargs):
        if self.__cls not in self.__instances:
            self.__instances[self.__cls] = self.__cls(*args, **kwargs)
        return self.__instances[self.__cls]
        
        
# 使用类装饰器Singleton来装饰Dog类
@Singleton
class Dog:
    def __init__(self, name):
        self.__name = name
        
        
print(Dog("kitty") is Dog("Lisa"))

2.3.4 最具实力的小班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。打算参加小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。

(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,包拿Offer
(3) 数据分析高薪就业班,月薪11K-15K, 免费领取课程大纲
(4)
Python大数据挖掘,量化投资就业班,月薪12K-25K,免费领取课程大纲

扫码免费领取Python学习资料:



欢迎 发表评论: