【问题标题】:Python dynamic class names [duplicate]Python动态类名[重复]
【发布时间】:2011-11-09 00:21:09
【问题描述】:

可能重复:
Dynamic loading of python modules
python: How to add property to a class dynamically?

我有一个包含文件名和类名的字典,如何导入此类名称以及如何创建此类?

例子:

classNames = { 'MCTest':MCTestClass}

我想导入 MCTest 并创建 MCTestClass。

【问题讨论】:

  • 我完全听不懂你在说什么。您能否重新表述您的问题,也许可以举一些例子说明您的字典中有什么,以及之后您想拥有什么?这个“文件名”是什么?
  • 我假设他有模块和类名作为字符串并想实例化类
  • 是的,完全正确。感谢您的帮助

标签: python dynamic


【解决方案1】:

你必须使用__import__函数:

http://docs.python.org/library/functions.html#import

文档页面示例:

>>> import sys
>>> name = 'foo.bar.baz'
>>> __import__(name)
<module 'foo' from ...>
>>> baz = sys.modules[name]
>>> baz
<module 'foo.bar.baz' from ...>

要从 baz 实例化一个类,您应该能够做到:

>>> SomeClass = getattr(baz, 'SomeClass')
>>> obj = SomeClass()

【讨论】:

  • 如果我不知道类名,但类名与模块名相同,如何创建类?
  • 使用getattr从模块中获取类(见我的更新)
【解决方案2】:

来自 turbogears.util:

def load_class(dottedpath):
    """Load a class from a module in dotted-path notation.

    E.g.: load_class("package.module.class").

    Based on recipe 16.3 from Python Cookbook, 2ed., by Alex Martelli,
    Anna Martelli Ravenscroft, and David Ascher (O'Reilly Media, 2005)

    """
    assert dottedpath is not None, "dottedpath must not be None"
    splitted_path = dottedpath.split('.')
    modulename = '.'.join(splitted_path[:-1])
    classname = splitted_path[-1]
    try:
        try:
            module = __import__(modulename, globals(), locals(), [classname])
        except ValueError: # Py < 2.5
            if not modulename:
                module = __import__(__name__.split('.')[0],
                    globals(), locals(), [classname])
    except ImportError:
        # properly log the exception information and return None
        # to tell caller we did not succeed
        logging.exception('tg.utils: Could not import %s'
            ' because an exception occurred', dottedpath)
        return None
    try:
        return getattr(module, classname)
    except AttributeError:
        logging.exception('tg.utils: Could not import %s'
            ' because the class was not found', dottedpath)
        return None

像这样使用它:

cls = load_class('package.module.class')
obj = cls(...)

【讨论】:

    猜你喜欢
    • 2021-10-25
    • 1970-01-01
    • 2023-01-30
    • 2011-04-29
    • 1970-01-01
    • 2012-08-19
    • 2016-10-19
    • 2013-05-05
    相关资源
    最近更新 更多