Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:使库使用重新定义的类_Python_Python 3.x_Oop_Derived Class - Fatal编程技术网

Python:使库使用重新定义的类

Python:使库使用重新定义的类,python,python-3.x,oop,derived-class,Python,Python 3.x,Oop,Derived Class,想象一下使用python库。假设这个库有一个脚本和几个感兴趣的类。所有这些类都在单个文件中定义。假设类D被导入并由类A、B和C以多种方式使用。同样,类A使用类B,类B使用类C。脚本直接使用类A,从而直接和间接使用类D。现在假设您希望自定义D,并在本地定义从类D派生的类D' 让脚本和其他类(A、B、C)使用类D'而不是D'最优雅的方法是什么 谢谢你,祝你今天愉快 你可以 a.py导入D的方式很重要 # a.py from d import D class A(): my_d = D()

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

让脚本和其他类(A、B、C)使用类D'而不是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()
了解如何做到这一点也可能会有所帮助。如果它是一个玩具,你可以直接使用它<代码>补丁尤其是

猴子补丁是一种代码味道,这取决于应用程序代码中的unittest。没有一件是“优雅的”。如果您是库作者,请支持依赖项注入

如果你很勇敢,你可能会拿出一些补丁装饰器,而不是专注于模拟。由于此模式存在于unittest库中,因此可以将其视为pythonic和“优雅”模式,但需注意上述事项


如果您对其工作原理感兴趣,您可以修改模块
a
的符号表。有关详细信息,请参阅和。

没有一般性的答案,您打算具体做什么?这完全取决于导入的管理方式。例如,如果脚本使用
from d import d
而不是
import d
,然后在文件中使用
d.d
引用
d
,这将非常困难。对于
json
等常见库,您可以继承类,然后在函数调用中使用该类,例如
json.dump(x,fp,encoder=YourNewClass)
谢谢你(和其他所有人)。一旦我了解了它,它就变得非常简单。对于其他理解它有困难的人来说,这里有一个不太抽象的例子,我在知道monkey patch一词后发现:()。接下来:为什么我的monkey patch会崩溃?我使用的库是ray 0.6.2()我成功地应用了我的补丁如下:
ray.tune.trial.trial.init_logger=custom_init_logger
。到目前为止,一切都很好。现在我还想修补另一个函数
ray.rllib.evaluation.metrics.summary_scents=custom_summary_scent_scents
,它不起作用。回过头来我发现,
ray.rllib.agents.dqn.DQNAgent、 train=exit
起作用,
ray.tune.trainable.train=exit
不起作用。“trainable”被导入,它的train函数在代理train函数中被调用。@DisplayName我怀疑发生的是
ray.rllib.agents.dqn.DQNAgent.train
是从
ray.tune.trainable.trainable.train
导入的此导入之后出现,并且您已经修补了
ray.tune.trainable.trainable.train
,使用它的地方引用了原始函数。
def builder():
    from d import D
    return D()
@patch('A.d.D', new=D_prime)
def my_func(...):
    a = A() # a.d.D is D_prime