想象一下使用python库。假设这个库有一个脚本和几个感兴趣的类。所有这些类都在单个文件中定义。假设D类是以多种方式由A,B和C类导入和使用的。同样,类A使用类B,类B使用类C.脚本直接使用类A,因此直接和间接使用类D.现在假设您要自定义D并在本地定义类D'源自D类。
使脚本和其他类(A,B,C)使用D类而不是D的最优雅方法是什么?
谢谢你,祝你有美好的一天!
# a.py
import d
class A():
my_d = d.D()
# script.py
A.d.D = D_prime
def foo():
a_cls = a.A() # uses A.d.D is D'
a.py进口D的方式很重要
# a.py
from d import D
class A():
my_d = D()
# script.py
A.D = D_prime
def foo():
a_cls = a.A() # uses A.D is D'
其他进口计划可能涉及类似的模式。这样的事情可能很难修补。
def builder():
from d import D
return D()
看看mock
library如何做到这一点也可能有所帮助。如果它是玩具,你可以直接使用它。 patch
尤其是interesting。
@patch('A.d.D', new=D_prime)
def my_func(...):
a = A() # a.d.D is D_prime
猴子修补是一种代码气味,取决于应用程序代码中的unittest是一种气味。没有一个是“优雅的”。如果您是图书馆作者,请支持依赖注入。
如果你很勇敢,你可能会把一些补丁装饰器拉出来,而不是专注于模拟。因为这个模式存在于unittest库中,所以它可以被认为是pythonic和“优雅”的上面的警告。