动态加载类并获取引用

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

Python正在做我的坚果。我不认为加载一些模块并动态地实例化类是如此困难。我在这里已经阅读了其他几个问题,但是所提供的解决方案似乎都不适用于我。

我的文件夹结构

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

我的目标

要以很少的代码和没有任何hacky的方式,动态地导入这些模块中的每一个并获得对类的引用,以便我可以实例化它们并获取它们的属性。

我目前的代码

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)
            })

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

python
2个回答
1
投票

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)
         })

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

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

0
投票

您可以使用importlib模块。

请查看以下示例:

目录结构:

Current_Dir
    |
    |---qwerty.py
    |
    |---dinesh 
          |
          |--dsp.py -->> This file has class 'call_me' 

dsp.py代码:

class call_me(object):

    def __init__(self):
        pass

    def run(self):
        print("Dinesh")

qwerty.py代码:

import sys
import os
import importlib

lib_path = os.getcwd() + os.sep + 'dinesh'
sys.path.insert(0,lib_path)

mod = importlib.import_module('dsp')
a = getattr(mod,'call_me')
s = a()
s.run()

产量

C:\Users\punddin\PycharmProjects\demo>python qwerty.py
Dinesh
© www.soinside.com 2019 - 2024. All rights reserved.