当前位置: 首页 > 面试题库 >

Python装饰器和装饰器模式有什么区别?

周龙光
2023-03-14
问题内容

“ Python装饰器”和“装饰器模式”之间有什么区别?

什么时候应该使用Python装饰器,什么时候应该使用装饰器模式?

我正在寻找Python装饰器和完成装饰器模式的示例。

@AcceptedAnswer

我知道Jakob
Bowyer的答案
是正确的。但是正是斯里卡的回答使我明白了原因。

在Srikar回答之后,并研究了给定的资源,我编写了此示例,以便可以可视化并了解Python装饰器和装饰器模式。

我必须 不同意 Srikar的“ Python装饰器不是装饰器模式的实现 ”。学到了这些之后,
我坚信Python装饰器是装饰器模式的实现。 只是不是以经典的方式。

此外 ,我还需要补充一点,尽管Srikar说过“ Python装饰器在定义时为功能和方法添加了功能 ”,但
您仍可以在运行时轻松使用Python装饰器

但是,我仍然将Srikar的答案标记为已接受,因为它帮助我了解
Python中装饰器模式
的实现

"""
Testing Python decorators against the decorator pattern
"""
def function(string):
    return string

def decorator(wrapped):
    def wrap(string):
        # Assume that this is something useful
        return wrapped(string.upper())
    return wrap

def method_decorator(wrapped):
    def wrap(instance, string):
        # Assume that this is something useful
        return wrapped(instance, string.upper())
    return wrap

@decorator
def decorated_function(string):
    print('! '.join(string.split(' ')))

class Class(object):
    def __init__(self):
        pass
    def something_useful(self, string):
        return string

class Decorator(object):
    def __init__(self, wrapped):
        self.wrapped = wrapped
    def something_useful(self, string):
        string = '! '.join(string.split(' '))
        return self.wrapped().something_useful(string)

    @method_decorator
    def decorated_and_useful(self,string):
        return self.something_useful(string)


if __name__ == '__main__':
    string = 'Lorem ipsum dolor sit amet.'
    print(function(string))                  # Plain function
    print(decorator(function)(string))       # Python decorator at run time
    print(decorated_function(string))        # Python decorator at definition time
    a = Class()
    print(a.something_useful(string))        # Plain method
    b = Decorator(Class)
    print(b.something_useful(string))        # Decorator pattern
    print(b.decorated_and_useful(string))    # Python decorator decorated the decorator pattern

问题答案:

装饰器模式
-在面向对象的编程中,装饰器模式是一种设计模式,可将行为动态添加到现有对象。装饰器模式可用于在运行时扩展(装饰)某个对象的功能,而与同类的其他实例无关,前提是在设计时已完成一些基础工作。

在Python装饰
-尽管名字,Python的装饰不是装饰模式的实现。装饰器模式是在静态类型的面向对象的编程语言中使用的设计模式,以允许在运行时将功能添加到对象。Python装饰器在定义时将功能添加到函数和方法中,因此比装饰器模式类是更高层次的构造。

装饰器模式本身可以在Python中轻松实现,因为该语言是鸭子类型的,因此通常不这样考虑。因此,在Python中,装饰器是用于修改函数,方法或类定义的任何可调用Python对象。



 类似资料:
  • 问题内容: 基本上,我想知道为什么必须创建一个抽象装饰器类来实现(或扩展)某些接口(或抽象类)。为什么所有新的“装饰类”都不能简单地实现(或扩展)基本抽象对象本身(而不是扩展抽象装饰器类)? 为了更具体一点,我将使用设计模式书中涉及咖啡饮料的示例: 有一个称为的抽象组件类 简单的饮料类型,例如简单扩展 为了装饰饮料,创建了一个抽象类,该类扩展并具有 假设我们要添加“牛奶”调味品,将创建一个扩展 我

  • rank ▲ ✰ vote url 14 805 326 554 url 装饰器@staticmethod和@classmethod有什么区别? 也许一些例子会有帮助:注意foo, class_foo 和static_foo参数的区别: class A(object): def foo(self,x): print "executing foo(%s,%s)"%(self,

  • 主要内容:介绍,实现,Shape.java,Rectangle.java,Circle.java,ShapeDecorator.java,RedShapeDecorator.java,DecoratorPatternDemo.java装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 我

  • 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。 介绍 意图:动态地给一个对象添加

  • 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。 介绍 意图:动态地给一个对象添加

  • 装饰器是旨在提升重用性能的一种结构性设计模式。同Mixin类似,它可以被看作是应用子类划分的另外一种有价值的可选方案。 典型的装饰器提供了向一个系统中现有的类动态添加行为的能力。其创意是装饰本身并不关心类的基础功能,而只是将它自身拷贝到超类之中。 它们能够被用来在不需要深度改变使用它们的对象的依赖代码的前提下,变更我们希望向其中附加功能的现有系统之中。开发者使用它们的一个通常的理由是,它们的应用程

  • Whenever we want to add extra functionality to an object, we have a number of different options. We can: 任何时候,只要我们想给一个对象添加附加的功能,就有多个不同的选项供我们选择。我们可以选择: Add the functionality directly to the class the o

  • 问题内容: 假设我有一个名为的类,并且我想使用装饰器设计模式。如果我错了,请纠正我,但是要使其正常工作,我们需要创建一个装饰器类,例如,该类将保留对实例的引用,所有其他装饰器将对其进行扩展以添加功能。 我不明白为什么我们必须创建装饰器类而不是使用实例? 问题答案: 装饰器模式用于动态地(即在运行时)向对象添加功能。通常,在编写类时,对象将具有固定的功能。但是重要的一点是,对象的功能以对对象的客户端