如何在不改动模块的情况下重写其中某一个关键类,且其他依赖关键类的文件能自动调用重构后的类?

2021-07-13 16:38:56 +08:00
 Elliota

说的有点抽象,下面用 selenium 模块举个例子。

remote/webdriver.py文件中有下面一个类,为标题说的关键类。

class WebDriver(object):
    pass

chrome/webdriver.py文件中,依赖上述关键类,称这个文件为依赖关键类的文件,其内容如下。

#...
from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver
#...
class WebDriver(RemoteWebDriver):
    pass

现在,我想重写关键类。并且,依赖关键类的文件的文件会自动调用我重写的类,基本要求是不改动模块文件。

不知列位有没有看懂,我尽力表达了... 各位 v 友,有招嘛,不懂得但是对这个问题有兴趣的可以回一下贴,顶一下,让大佬看到😁,感谢感谢~

1745 次点击
所在节点    Python
6 条回复
pursuer
2021-07-13 19:05:53 +08:00
修改 sys.path 或者 sys.meta_path,让 import 优先加载你自己写的 py 文件
renmu123
2021-07-13 19:21:03 +08:00
猴子补丁?
wuwukai007
2021-07-13 19:29:51 +08:00
chrom/__init__.py
class MyWebDriver:
pass
from selenium.webdriver.remote import webdriver
webdriver.WebDriver = MyWebDriver
muzuiget
2021-07-13 21:59:53 +08:00
就是 monkey patch 大法,很正常的操作。
lanlanye
2021-07-14 10:10:30 +08:00
如果依赖关键类的文件都是你自己写的,改个名字就可以了,否则就按楼上的来
crclz
2021-07-14 11:51:45 +08:00
在自己的工程中,叫依赖注入。注意子类要能够里氏替换。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/789291

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX