zoukankan      html  css  js  c++  java
  • 设计模式- 结构型模式,装饰器模式(5)

    无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法。
     如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法)
     使用组合
     使用继承
    与继承相比,通常应该优先选择组合,因为继承使得代码更难复用,继承关系是静态的,并且应用于整个类以及这个类的所有实例(请参考[GOF95,第31页]和网页[t.cn/RqrC8Yo])。
    设计模式为我们提供第四种可选方法,以支持动态地(运行时)扩展一个对象的功能,这种方法就是修饰器。修饰器(Decorator)模式能够以透明的方式(不会影响其他对象)动态地将功能添加到一个对象中(请参考[GOF95,第196页])。
    在许多编程语言中,使用子类化(继承)来实现修饰器模式(请参考[GOF95,第198页])。
    在Python中,我们可以(并且应该)使用内置的修饰器特性。一个Python修饰器就是对Python语法的一个特定改变,用于扩展一个类、方法或函数的行为,而无需使用继承。从实现的角度来说,
    Python修饰器是一个可调用对象(函数、方法、类),接受一个函数对象fin作为输入,并返回另一个函数对象 。这意味着可以将任何具有这些属性的可调用对象当作一个修饰器。在第1章和第2章中已经看到如何使用内置的property修饰器让一个方法表现为一个变量。在5.4节,我们将学习如何实现及使用我们自己的修饰器。
    修饰器模式和Python修饰器之间并不是一对一的等价关系。Python修饰器能做的实际上比修饰器模式多得多,其中之一就是实现修饰器模式

    class Foo(object):
        def f1(self):
            print("original f1")
    
        def f2(self):
            print("original f2")
    
    
    class Foo_decorator(object):
        def __init__(self, decoratee):
            self._decoratee = decoratee
    
        def f1(self):
            print("decorated f1")
            self._decoratee.f1()
    
        def __getattr__(self, name):
            return getattr(self._decoratee, name) 
    
    u = Foo()
    v = Foo_decorator(u)
    v.f1()
    v.f2()
    

    1、上面这个装饰者模式,和普通认为的python装饰器比有一些区别。这个是正儿八经的的支持任何面向对象语言的写法。python还有独有的@形式的装饰器。

    2、使用python特有的装饰器写法,举一个简单例子:

    用装饰类改变呢f1的功能。

    在py中用@装饰器是

    # coding=utf-8

    def decorator(func):
    def _inner(*args, **kwargs):
    print '在前面加点东西'
    func(*args, **kwargs)
    print '在后面加点东西'
    return _inner


    @decorator
    def f1(a):
    print a

    f1(5)
  • 相关阅读:
    蓝桥杯2016初赛
    蓝桥杯2016初赛
    蓝桥杯2016初赛
    蓝桥杯2015初赛
    关于VS本身遇到的一些相关问题
    VS的一些常用快捷键
    蓝桥杯2015初赛
    Luogu P1704 寻找最优美做题曲线
    POI2009 LYZ-Ice Skates
    Luogu P4313 文理分科
  • 原文地址:https://www.cnblogs.com/twodog/p/12137377.html
Copyright © 2011-2022 走看看