参考资料:
介绍
写代码最好能够复用代码,避免重复造轮子。在面向对象的语言中,有一个概念叫做Mixin
,在Python中通过多重继承来实现。
不同的语言中,Mixin
形式会有区别,但是相同的是,他们都封装了可重用的代码,以供其他类使用。
真正的继承和Mixin
的区别很微妙,Mixin
不会单独使用,并且也不作为抽象类。
示例
对已有代码添加日志功能,可以用下面的方法实现:
1 | import logging |
上面的方式不算差,但是如果有几十个类,就会变得复杂。可以创建LoggerMixin
类,达到相同的效果:
1 | import logging |
封装好日志模块后,可以添加至已有的代码中:
1 | class EssentialFunctioner(LoggerMixin, object): |
这样只需要编写一次代码,在使用时继承LoggerMixin
,调用self.logger
即可。
Mixin
的重度使用可以节约很多时间,并且提升代码的可阅读性。
该作者的一个使用案例是,在一个Django
项目中,有几个基于类的视图函数需要控制职能由内网发起访问。有一个中间件可以进行检查,如果通过外网访问直接响应HTTP 404
,那么就需要在视图函数的dispatch
方法上使用decorator_from_middleware
和method_decorator
。
1 | from django.utils.decorators import decorator_from_middleware, method_decorator |
如果有其他的视图函数需要进行控制,那么也需要为他们添加装饰器。作者的做法是,将网络保护的代码集成到Mixin
,允许基于类的视图函数继承:
1 | from django.utils.decorators import decorator_from_middleware, method_decorator |
同理,可以将Mixin
用于权限、认证等方面。Mixin
使代码更具表现力,降低了复杂性,方便了理解和单元测试。