1 Mixin

1.1 Introduction

  • Mixin–是一种开发模式.
  • Mixin–是一种将多个类中的功能单元进行组合利用的一种方式.
  • Mixin–不作为任何类的基类, 不关于与哪些类在一起, 仅仅在运行时与其他类一起组合使用.

ps: 实际上类似类之间的依赖, 只不过后者需要实例化并在init中引用, 不适合于python.

1.2 Application Context

优势:

  • 不修改源码前提下, 对已有类进行扩展;
  • 确保各个组件的清晰划分;
  • 使用已有的功能来组合, 实现”新类”;

使用场景:

  • You want to provide a lot of optional features for a class.
  • You want to use one particular feature in a lot of defferent class.

1.3 Example

Werkzeug包里面的使用实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from werkzeug import BaseRequest

class Request(BaseRequest):
pass

# 1 add accept header support
from werkzeug import AcceptMixin
class Request(BaseRequest, AcceptMixin):
pass

# 2 add others
from werkzeug import BaseRequest, AcceptMixin, ETagRequestMixin, UserAgentMixin, AuthenticationMixin
class Request(BaseRequest, AcceptMixin, ETagRequestMixin, UserAgentMixin, AuthenticationMixin):
pass

ThreadingMixIn:

见socketserver.ThreadingMixIn类, 其中仅仅存在两个函数: process_request(创建线程), process_request_thread(线程回调). 可以看出 MixIn 类目的:

  • 不是为了实例化而创建,不是自包含自运行的类, 里面有些方法甚至都是未定义就先使用了.
  • 职责非常单一
  • 必须结合所需映射功能的类才能”自运行”

2 Lazy and Short-circuit

理解惰性运算和求值运行顺序的区别.

求值运算顺序(短路运算):
Lazy and short-circuit

3 Redefined

3.1 Introduction

  • 面向对象本身从框架上就支持重定义操作, 只不过正常用法是在类的继承中使用. 但是如果将模块当成一个巨大的对象的话, 其实也可以进行类名/函数名等的重定义操作.
  • 本质上, redefined就是一次重新引用过程, 只不过编码时为了避免错乱, 在编辑器层级进行报错处理.

3.2 Example

redefined:

1
2
3
4
5
class A(object):
pass
# interpreter运行时, 不会报错
class A(object):
pass

Type:

1
2
3
4
class A(object):
pass
# 利用type来创建新的类
NEWA = type('A', (object,), dict())