在Python开发中,我们经常需要使用第三方模块。为了自定义一些行为,我们可能需要对第三方模块进行扩展。本文将介绍两种常见的扩展方式:Composition(组合)
和Monkey Patch(猴子补丁)
,并比较两者的优缺点。
Composition的核心思想是,不直接修改第三方模块,而是将其封装在一个新类中,通过组合的方式实现扩展。
例如,有一个第三方模块math:
# math.py
def add(x, y):
return x + y
def multiply(x, y):
return x * y
我们可以这样通过组合扩展它:
import math
class MathPlus:
def __init__(self):
self.math = math
def add(self, x, y):
return self.math.add(x, y) * 2
def multiply(self, x, y):
return self.math.multiply(x, y)
使用MathPlus时:
math_plus = MathPlus()
print(math_plus.add(2, 3)) # 10
这种方式的优点是:
Monkey Patch
机制可以在运行时动态修改模块的属性和方法,实现对模块的扩展。
例如,可以这样扩展math模块:
import math
# 新增一个add方法
def add(x, y):
return x + y * 2
math.add = add
# 修改既有的multiply方法
def new_multiply(x, y):
return x * y * 2
math.multiply = new_multiply
使用时,math模块已经被扩展了:
print(math.add(2, 3)) # 8
print(math.multiply(2, 3)) # 12
这种方式的优点是: