gpt4 book ai didi

python - 动态加载类并获取引用

转载 作者:太空宇宙 更新时间:2023-11-03 14:21:25 25 4
gpt4 key购买 nike

Python 正在做我的事情。我没想到加载一些模块并动态实例化其中的类会如此困难。我在这里阅读了其他几个问题,但所提供的解决方案似乎都不适合我。

我的文件夹结构

./coin.py
./exchanges/
/bittrex.py (contains Bittrex class)
/kraken.py (contains Kraken class)
...

我的目标

用尽可能少的代码并且无需任何黑客手段,动态导入每个模块并获取对其中类的引用,以便我可以实例化它们并获取它们的属性。

我当前的代码

import glob, exchanges, dirfiles, isfile, inspect

dirfiles = glob.glob(dirname(__file__) + "/exchanges/*.py")
__all__ = [ basename(f)[:-3] for f in dirfiles if isfile(f) and not f.endswith('__init__.py')]

class Indicator(object):
def __init__(self):
for exchange in __all__:
class_name = exchange.capitalize()
class_ = getattr(exchange, class_name)

self.EXCHANGES.append({
'code': exchange,
'name': class_name,
'instance': class_(self)
})

然而,上面的代码和我尝试过的许多不同的排列总是最终将我想要的类引用解释为字符串。

最佳答案

Importlib 允许动态加载模块和包,os.listdir 简化了文件查找:

import os
import importlib

for p in os.listdir('exchanges'):
if p[-3:] == '.py' and p != '__init__.py':
module_ = importlib.import_module("exchanges.%s" % p[:-3])
class_ = getattr(module_, class_name)

self.EXCHANGES.append({
'code': exchange,
'name': class_name,
'instance': class_(self)
})

我不确定您的代码中的capitalze。如果它是每个文件中的函数,则可以使用以下命令执行它:

capitalize = getattr(module_, 'capitalize')
class_name = capitalize()

关于python - 动态加载类并获取引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47919249/

25 4 0
文章推荐: python - 如何在 Python 中打开和编辑现有文件?
文章推荐: c# - 如何从 list 中获取对象的成员?