Python中的装饰器必须实现装饰器模式吗?
问题描述:
在Python,Python中的装饰器必须实现装饰器模式吗?
-
它是正确的,在Python装饰可以改变 的界面处的装饰功能/类,例如修改 装饰类的装饰功能和方法的签名?例如:
>>> def MyDecorator(func): ... def NewFunc(): ... pass ... return NewFunc ... >>> @MyDecorator ... def MyFunc(a, b, c): ... print(a,b,c) ...
所以在Python装饰不一定用于由GoF的书中“设计模式”中描述的实施装饰设计模式?
编写修饰装饰函数/类的接口的装饰器是不好的做法吗?
谢谢。
答
从python.org(我的强调):
的DecoratorPattern处于DesignPatternsBook描述的图案。 这是一种明显修改对象行为的方式,通过将 包含在具有类似接口的装饰对象中。
这不要与PythonDecorators混淆,这是一种语言 功能动态修改函数或类。
所以我猜这个问题的答案是:
- 是
- 这是正确的
- 没有
答
您还可以找到一些答案在著名的Python decorator库文档。
引述Introduction:
从技术上讲,它可以与一个参数调用任何Python对象可以被用作装饰。但是,这个定义有点太大而不能真正有用。这是更方便分裂泛型类装饰的两个子类:
签名保留装饰:它接受一个函数作为输入,并返回一个函数作为输出,具有相同签名
调用对象。
签名变化的装饰:
装修改变它们的输入功能的签名,或装饰器返回非可调用的对象。
签名变化的装饰器有它们的用途:例如,内置类staticmethod和classmethod在这个组中。它们接受函数并返回既不是函数又不可调用的描述符对象。
仍然,签名保留装饰器更常见,并且更容易推理。特别是,它们可以组合在一起,而其他装饰者通常不能。
相同的答案:
- 是
- 这是正确的
- 没有
我认为这个问题是好的 - 但过于宽泛。我的意思是你有3个问题(即使他们是松散连接)而不是一个。你能否试图缩小问题的范围? – MSeifert
@MSeifert谢谢。对我的问题是密切相关的,而且他们实际上是以不同形式陈述的同一个问题。如果我把它们分成三个帖子,我恐怕会重复。 – Tim