python元编程

Val*_*lev 4 python metaprogramming python-module

我正在尝试归档一个由于我不擅长Python元编程而变得有点复杂的任务.

我想要一个locations带有函数的模块get_location(name),它返回一个在文件夹的位置/中定义的类,其名称传递给function.类的名称类似于NameLocation.

所以,我的文件夹结构:

program.py
locations/
    __init__.py
    first.py
    second.py
Run Code Online (Sandbox Code Playgroud)

program.py将与:

from locations import get_location
location = get_location('first')
Run Code Online (Sandbox Code Playgroud)

和location是在first.py中定义的类,如下所示:

from locations import Location # base class for all locations, defined in __init__ (?)
class FirstLocation(Location):
    pass
Run Code Online (Sandbox Code Playgroud)

等等

好吧,我已经尝试了很多导入getattribute语句,但现在我感到无聊和投降.如何归档这种行为?


我不知道为什么,但这个代码

def get_location(name):
   module = __import__(__name__ + '.' + name)
   #return getattr(module, titlecase(name) + 'Location')
   return module
Run Code Online (Sandbox Code Playgroud)

回报

>>> locations.get_location( 'first')
<module 'locations' from 'locations/__init__.py'>
Run Code Online (Sandbox Code Playgroud)

位置模块!为什么?!

Ale*_*lli 6

你确实需要__import__这个模块; 在那之后,从中获取一个attr并不难.

import sys

def get_location(name):
    fullpath = 'locations.' + name
    package = __import__(fullpath)
    module = sys.modules[fullpath]
    return getattr(module, name.title() + 'Location')
Run Code Online (Sandbox Code Playgroud)

编辑:__import__返回包,所以你还需要一个getattr,看看文档(并仔细阅读所有部分 - "按照我的说法不做我做";-).