Python:装饰器和混合使用的区别?

24

我已经理解了装饰器和混合类的基本概念。装饰器可以为一个对象添加新功能,而不会改变同一类的其他对象实例,而混合类是一种多重继承方式,用于从多个父类继承。

这是不是意味着当您需要修改单个对象实例时应该使用装饰器,而当您需要创建全新的对象类时应该使用混合类?或者,我有没有漏掉什么?两者的实际用例是什么?


3
这是一个很好的问题,我想知道答案,但不幸的是它会被关闭,因为它不在StackOverflow的范围之内。这是因为它“主要基于个人观点”,而这是关闭问题的主要原因。http://stackoverflow.com/help/search?q=opinion - GreenAsJade
1个回答

29
在我看来,当您需要让几个不同的类具有相同功能时,就需要使用混入(mixins)。
使用混入的很好的例子是 Django 的基于类的视图。例如,您有几个不同的类: FormView、 TemplateView 和 ListView。它们都有一个相似的功能:它们必须呈现模板。每个类都有一个混入,它添加了所需的用于模板呈现的方法。
另一个例子是如果您需要添加一个返回 JSON 结果的 API 类。它也可以从一个基础 View 类继承。您只需跳过模板混入,定义自己需要的内容(并可能编写自己的混入以进行 JSON 编码)。
此外,您可以重写混入中提出的一些方法,这使您可以修改某些公共代码的某些部分以适应您的本地情况。这就是面向对象编程,伙计!
简而言之:混入会添加新功能。
装饰器用于修改现有功能。例如,如果您需要记录从类中某个方法返回的内容,则正确的选择是使用装饰器(添加到相应的方法中)。
希望对您有所帮助。如果不行,请问问题。我将更新我的回答。

非常好的回答。我对混合和装饰器之间的区别的印象是,混合具有目标接口的子集,而装饰器具有目标接口的超集。换句话说,混合是超类型(和超类),而装饰器是目标的子类型(和子类)。 - Géry Ogam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接