Python:make lib使用重新定义的类

问题描述 投票:2回答:1

想象一下使用python库。假设这个库有一个脚本和几个感兴趣的类。所有这些类都在单个文件中定义。假设D类是以多种方式由A,B和C类导入和使用的。同样,类A使用类B,类B使用类C.脚本直接使用类A,因此直接和间接使用类D.现在假设您要自定义D并在本地定义类D'源自D类。

使脚本和其他类(A,B,C)使用D类而不是D的最优雅方法是什么?

谢谢你,祝你有美好的一天!

python python-3.x oop derived-class
1个回答
1
投票

你可以monkey patch the library

# 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和“优雅”的上面的警告。

如果您对它的工作原理感兴趣,那么您将修改模块a的符号表。有关详细信息,请参阅globalslocals

© www.soinside.com 2019 - 2024. All rights reserved.