gpt4 book ai didi

python - 装饰器与继承

转载 作者:太空狗 更新时间:2023-10-29 16:53:46 25 4
gpt4 key购买 nike

当两者都可能时,您如何决定是使用装饰器还是继承?

例如,this problem有两个解决方案。

我对 Python 特别感兴趣。

最佳答案

装饰器...:

  • ...如果您想做的是“包装”,则应使用。包装包括采取一些东西,修改(或注册它),和/或返回一个行为“几乎完全”与原始对象一样的代理对象。
  • ...只要您不创建大量代理对象,就可以应用类似混合的行为。
  • ...有一个隐含的“堆栈”抽象:

例如

@decoA
@decoB
@decoC
def myFunc(...): ...
...

相当于:

def myFunc(...): ...
...
myFunc = decoA(decoB(decoC(myFunc))) #note the *ordering*

多重继承...:

  • ... 最适合向类添加方法;您不能使用它轻松地装饰函数。在这种情况下,如果您只需要一组“鸭子打字风格”的额外方法,它就可以用来实现类似混合的行为。
  • ... 如果您的问题与父类(super class)构造函数等问题不匹配,可能会有点笨拙。例如,子类 __init__ 方法将不会被调用,除非它被显式调用(通过方法解析顺序协议(protocol))!

总而言之,如果装饰器不返回代理对象,我会使用装饰器实现类似混合的行为。一些示例将包括任何返回原始函数的装饰器,稍作修改(或在某处注册或将其添加到某个集合之后)。

你经常会发现装饰器的东西(比如内存)也是很好的候选者,但如果它们返回代理对象,应该适度使用;它们的应用顺序很重要。太多的装饰器以一种他们不打算使用的方式使用它们。

如果这是一个“经典的继承问题”,或者如果我需要的 mixin 行为只是方法,我会考虑使用继承。一个经典的继承问题是您可以在任何可以使用父项的地方使用子项的问题。

一般来说,我会尝试编写不需要增强任意内容的代码。

关于python - 装饰器与继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6406446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com